1.将数值转为字符串保存
现有一个数组numbers,数组中有一些需要被保存到文件中的数据。
int numbers[] = {1, 12, 123, 1234, 12345, 10, 123456, 1234567};
由于数组的元素都是整型的数值,可以使用fprintf函数,配合上转换规范"%d\n",将整型按照十进制转换为字符串,且在每个字符串后加上字符'\n',用于换行并且区分每个字符串。
#include <stdio.h>
int main()
{
// 创建一个名为data.txt的文件
FILE *pFile = fopen("data.txt", "w");
if(pFile == NULL)
{
// 文件创建失败
return -1;
}
// 装有数值的数组
int numbers[8] = {1, 12, 123, 1234, 12345, 10, 123456, 1234567};
for (int i = 0; i < 8; i++)
{
// 将数值打印至文件,每行一个数值
fprintf(pFile, "%d\n", numbers[i]);
}
// 关闭文件
fclose(pFile);
return 0;
}
编译并运行后,使用文本编译器打开文件data.txt可以发现,数值已经被转为换行分隔的字符串并保存在文件中了。

若使用十六进制查看器打开文件,可以发现。
字符串"1",ASCII为十六进制31,占用1个字节。

字符串"12",ASCII为十六进制31 32,占用2个字节。

字符串"123",ASCII为十六进制31 32 33,占用3个字节。

字符串"1234",ASCII为十六进制31 32 33 34,占用4个字节。

字符串"12345",ASCII为十六进制31 32 33 34 35,占用5个字节。

可以发现,若数值的十进制位数越多,字符串的字符也就越多,需要占用的空间也越大。
例如:
"1"有1个十进制位,需要1个字节。
"12345"有5个十进制位,需要5个字节。
"1234567"有7个十进制位,需要7个字节。
我们再观察一下每个字符串之间的分隔字符。之前打印时,函数fprintf中使用的转换规范为\n,也就是说每个字符串之间应当由换行符\n分隔。使用十六进制编译器查看文件时,发现每个字符串之间有两个字符间隔,这是为什么呢?

再回忆一下文件打开模式中的文本模式与二进制模式。由于上面的例子运行在Windows系统上,且使用文本模式打开文件。字符串中的'\n',被自动替换为'\r''\n',再输出到文件中。其ASCII码为十六进制0D 0A。