C程序读写txt文本

开始

参考菜鸟教程的代码开始写:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
FILE *fp = NULL;

fp = fopen("/tmp/test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}

fopen问题

我在VS2022中使用fopen函数,编译的时候会报错“’fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.”这个错误。

一开始学C语言的时候就遇到过这个报错,意思就是这些函数不安全,可以define一个“_CRT_SECURE_NO_WARNINGS”来忽略报错。但是这样会导致编译器同样忽略其他致命错误,记得大一的时候,有个同学告诉我他的程序跑不起来,但没有报错和警告,就是因为引用了这个定义(笑),所以不安全我就不用了,而且这个定义确实也不推荐在正式代码中使用。

读取数据

索引找不到

我文本存储数据是以一行开头的一串字符作为索引:

1
2
3
4
5
6
7
8
9
10
while (fgets(line, sizeof(line), fp))
{
// 判断是否以 目标字符串 开头
if (strncmp(line, data_name, data_length) == 0)
{
Storage_Data_Value = atof(line + data_length);
break;
}
}
fclose(fp);

但是出现了找不到索引的情况,我感觉是因为txt中包含了隐藏字符导致识别不到索引,可以用notepad–来删掉隐藏字符,但我是让程序直接生成了文本再读取也可以的。就像这样:

1
fprintf(fp, "example_title 114514\n");

(笑)

自动判断索引大小

我写的代码索引是字符加一个空格,索引多了,每一个都要自己指定长度太麻烦了,所以我想自动计算索引长度:

1
int data_length = (int)strlen(data_name);	// 自动推算长度

比如“example_title ”的长度是14。

读取数据的存储

代码读取的数据是存储在Storage_Data_Value中的,但是我不想把Storage_Data_Value当作全局变量,所以我用了指针返回了数据:

1
*out_data = Storage_Data_Value;

写入数据

读写指针

查找了一些资料,我知道了如果将FILE* fp = NULL当全局变量使用,可能会在多线程运行的时候出现问题,所以我改为了函数内的局部变量;同时由于写入操作是既要读又要写的,所以我又在这个函数里分成了FILE* read_fp = NULLFILE* write_fp = NULL,这样应该就不会有什么问题了。

读取整个文件

由于标准C文件操作(比如fopen、fprintf)不支持直接删除或插入某一行,所以我只能把整个文件读下来,然后改某一行,最后再重新写进去。

1
char read_buffer[4096] = { 0 };				// 临时存储文件所有内容

我声明了一共4096字节,按照我存储的方式,可以存储100行左右的数据。
这里我又遇到了sprintf的安全问题,使用sprintf_s代替,防止缓冲区溢出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while (fgets(line, sizeof(line), read_fp))
{
if (strncmp(line, data_name, name_len) == 0)
{
found = 1;
// 修改该行参数
current_pos += sprintf_s(current_pos, sizeof(read_buffer) - (current_pos - read_buffer), "%s %lf\n", data_name, data_new_value);
}
else
{
// 保留原行参数
current_pos += sprintf_s(current_pos, sizeof(read_buffer) - (current_pos - read_buffer), "%s", line);

}
}

最后的代码就是这样的。


C程序读写txt文本
https://mrwei95.github.io/2025/05/26/C-FILE-Read-Write/
作者
Tommy Wei
发布于
2025年5月26日
更新于
2025年5月28日