天天看点

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.。