新手學習c++哈,歸納的寫了一下以 C++ 的方式寫入讀取文件,讀文件到控制台,並加了行號。博客記錄主要為了備忘。當然 ^_^ 喜歡同學的話可以拿走代碼直接用。轉帖注明出處哈。歡迎討論,我一直認為:知識是通過不斷的探討,學習,研究,質疑才能進行升華,提升的。
#include <iostream> #include <fstream> using namespace std; // 文件操作 class CFileOper { fstream m_pstrFile; public: CFileOper(const char *cFileDir) { try { m_pstrFile.open(cFileDir, ios::binary | ios::out | ios::in); if (!m_pstrFile.is_open()) { throw "文件打開失敗"; } } catch (const char * ErrorInfo) { cout << ErrorInfo; } } void writeDataToFile(char *cData, const int &nDataCount) { for (int i = 0; i < nDataCount; i++) { // m_pstrFile << cData[i] << endl; // 每遇到endl 引發一次同步,這種方式是不是會增加IO ?還是使用手動吧 m_pstrFile << cData[i] << "\n"; } // 手動引發同步 m_pstrFile.sync(); } void printFile(const char *cFileDir) { if (!m_pstrFile.is_open()) { cout << "Error opening file"; exit(1); } int tellg = m_pstrFile.tellg();
// 判斷文件指針是否在開頭 if (tellg != 0) { // 指針不在文件的開頭,重置指針位置 m_pstrFile.seekg(0, ios::beg); } int i = 1; while (!m_pstrFile.eof()) { // 讀取每一行的數據到緩沖區 char content[200] = { 0 }; m_pstrFile.getline(content, 100); cout << i << " :" << content << endl; i++; } } virtual ~CFileOper() { m_pstrFile.close(); } }; int _tmain(int argc, _TCHAR* argv[]) { CFileOper fileObj("test.txt"); // 寫入數據 char cContent[] = { "hello word" }; fileObj.writeDataToFile(cContent, _countof(cContent)); // 讀取數據 fileObj.printFile("test.txt"); return 0; }
小記: 在文件的讀的時候遇到了一些的困擾,主要問題來源於文件指針判斷是否在開頭的地方判斷失敗,以至於一直認為文件需要關閉后再次打開,並重新實例化才可以使用
當然這樣肯定是很蠢的做法。在不懈的努力與求解下,發現了問題的根源
int tellg = m_pstrFile.tellg(); if (tellg != 0) // 這個是正解。之前錯誤的寫法是 if(m_pstrFile.tellg() != 0) 當然這樣寫的話會發現是報錯的!
這個東西……tellg() 這個函數,通過查看原型,最后發現他是由模板實現的。而且返回值的類型也不是一個直接可用的int。
所以最后我用了一個int 類型的變量接收了它的返回值。然后就可用了。當然后續也試了一下 (int)tellg() 這樣強轉,也是可行的。
目前存在的疑惑是:文件過大的話,如果用 int 去接收這個函數的返回值。返回的大小會不會造成溢出。是不是需要用long來進行接收……