本文讲解的是向.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.。