C++ 文件流的方式操作文件(一個簡單的寫入,讀取)


 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM