13-3. 文件操作(3)

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

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可以发现,数值已经被转为换行分隔的字符串并保存在文件中了。

data.txt

若使用十六进制查看器打开文件,可以发现。

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

字符串`"1"`

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

字符串`"12"`

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

字符串`"123"`

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

字符串`"1234"`

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

字符串`"12345"`

可以发现,若数值的十进制位数越多,字符串的字符也就越多,需要占用的空间也越大。

例如:

"1"有1个十进制位,需要1个字节。 "12345"有5个十进制位,需要5个字节。 "1234567"有7个十进制位,需要7个字节。

我们再观察一下每个字符串之间的分隔字符。之前打印时,函数fprintf中使用的转换规范为\n,也就是说每个字符串之间应当由换行符\n分隔。使用十六进制编译器查看文件时,发现每个字符串之间有两个字符间隔,这是为什么呢?

'\n''\r'

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