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
。