新手學習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來進行接收……
