天天看點

C++檔案操作(向.txt檔案寫入資料)

本文講解的是向.exe同一目錄下的data檔案夾下的log.txt寫入資料。

1.相對路徑概念

 假若.exe所在路徑是E:\projects\logout\log\Debug。

1.1向上一級目錄指向

    ./    表示目前路徑,相當于E:\projects\logout\log\Debug

    ../  表示目前路徑的上一級路徑,相當于E:\projects\logout\log

    ../../  表示目前路徑上上一級路徑,相當于E:\projects\logout

    更多指向上級路徑的表示以此類推。

1.2 向下一級目錄指向

    ./data  表示目前路徑下一級路徑,相當于E:\projects\logout\log\Debug\data

    ./data/xxx   表示目前路徑的下下一級路徑,相當于 E:\projects\logout\log\Debug\data\xxx

    更多向下指向的路徑的表示以此類推。

2.檢查檔案路徑是否存在

檢查檔案夾data是否存在。

/**
*@param path 檔案路徑,可以具體到檔案名(如.txt)
*@param mode 檢查模式,00(檔案路徑是否存在),02(隻寫),04(隻讀),06(讀和寫)
*@return     -1(失敗)
*/ 
int _access(const char *path, int mode);  
           

 3.建立檔案路徑

如果檔案夾data不存在,則要建立檔案夾。

/**
*@param  dirname  檔案路徑,隻能包含檔案夾路徑,不能包含具體檔案名(如.txt)
*@return -1(建立失敗)
*/
int _mkdir(const char *dirname);  
           

4.字元連接配接得到完整路徑

_mkdir建立的是檔案夾路徑,要想得到完整的路徑,就要将它與檔案名連接配接起來。

/**
*将源字元串連接配接到目标字元串後面
*
*@param  strDestination    目标字元串
*@param  numberOfElements  目标字元串緩沖區大小
*@param  strSource         源字元串
*
*numberOfElements是合并字元串後的字元數量。 即,源串大小 + 目标串大小 + 字元串結束符大小("\0")。
*當numberOfElements小于合并字元串後的字元數量時會導緻執行錯誤,它的值必須大于等于合并字元串後的字元數量
*/
errno_t strcat_s(char *strDestination, size_t numberOfElements, const char *strSource );
           

5.打開檔案

/**
*@param [out]pFile   指向檔案指針的指針,檔案指針将接收指向已打開檔案的指針。
*@param [in]filename 檔案名路徑。
*@param [in]mode     允許的通路類型。
*@return             0(成功)
*/
errno_t fopen_s(FILE** pFile, const char *filename, const char *mode);  
           

字元串 

mode

 指定對檔案請求的通路類型,如下所示。

"r"

打開以便讀取。 如果檔案不存在或找不到,

fopen_s

 調用将失敗。

"w"

打開用于寫入的空檔案。 如果檔案存在,則其内容會被銷毀。

"a"

在檔案末尾打開以進行寫入(追加),在将新資料寫入到檔案之前請勿删除 EOF 标記。 如果檔案不存在,則建立檔案。

"r+"

打開以便讀取和寫入。 (該檔案必須存在。)

"w+"

打開用于讀取和寫入的空檔案。 如果檔案存在,則其内容會被銷毀。

"a+"

打開以進行讀取和追加。 追加操作包括在将新資料寫入檔案之前删除 EOF 标記并在寫入完成後還原 EOF 标記。 如果檔案不存在,則建立檔案。

6.向檔案寫入資料

/**
*@param fileName 檔案名路徑
*@param buf      資料緩沖區
*@return         傳回寫入的位元組數
*/
int fprintf(FILE* fileName,const char* buf);
           

寫入完成後記得重新整理緩沖區

/**
*重新整理緩沖區
*
*@param stream 檔案名路徑
*@return       0(成功重新整理緩沖區)
*/
int fflush(FILE *stream);  
           

7.關閉檔案

/**
*關閉檔案
*
*@param stream 檔案名路徑
*@return       0(成功關閉),EOF(出現錯誤)
*/
int fclose(FILE *stream);  
           

8.例程

#include "stdafx.h"
#include <direct.h>
#include <io.h>
#include <string.h>
using namespace std;
int main()
{
	char path[256] = "./data";

	if (_access(path, 00) == -1)          //檢查檔案路徑是否存在
	{
		if (_mkdir(path) == -1)           //建立檔案路徑
		{
			return -1;
		}
	}
	char *file = "/log.txt";
	strcat_s(path, sizeof(path), file);  //連接配接完整的檔案路徑

	FILE* fp;
	if (fopen_s(&fp, path, "a") != 0)    //打開檔案
		return -1;
	char buffer[1024] = "A test of  file operations.";
	int numberOfBuffer = fprintf(fp, buffer);         //寫入資料到log.txt

	fflush(fp);                         //重新整理緩沖區

	if (fclose(fp) != 0)                //關閉檔案
		return -1;

	return 0;
}
           

 本文多處參考MSDN.。