C语言一次读取文件全部内容(注意:ftell()在windows上会把回车符计算在内,linux不会计算回车符,但相比windows,会自动补全最后一行的换行符)

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言一次读取文件全部内容(注意:ftell()在windows上会把回车符计算在内,linux不会计算回车符,但相比windows,会自动补全最后一行的换行符)相关的知识,希望对你有一定的参考价值。

文章目录


(json_string.json)


  "person": 
    "firstname": "z",
    "lastname": "jadena",
    "email": "jadena@126.com",
    "age": 8,
    "height": 1.17
  

用malloc动态分配读取内容的存储空间

#pragma warning(disable : 4996)
#include <stdio.h>

int main()    

    FILE* fp;
    int file_size;   //保存文件字符数
    char* tmp;       //将文件内容读到此指针位置
    fp = fopen("./json_string.json", "r");   //打开文件
    fseek(fp, 0, SEEK_END);      //将文件指针指向该文件的最后
    file_size = ftell(fp);       //根据指针位置,此时可以算出文件的字符数
    printf("文件字符数为 %d\\n", file_size);
    tmp = (char*)malloc(file_size * sizeof(char)); //根据文件大小为tmp动态分配空间
    memset(tmp, '\\0', file_size * sizeof(char));  //初始化此控件内容,否则可能会有乱码
    fseek(fp, 0, SEEK_SET);                 //重新将指针指向文件首部
    fread(tmp, sizeof(char), file_size, fp); //开始读取整个文件
    printf("文件内容为\\n%s", tmp);
    return 0;

运行结果:

文件字符数为 141
文件内容为

  "person": 
    "firstname": "z",
    "lastname": "jadena",
    "email": "jadena@126.com",
    "age": 8,
    "height": 1.17
  

事先分配一个较大的存储空间

#pragma warning(disable : 4996)
#include <stdio.h>

int main()    

    FILE* fp;
    long file_size;   //保存文件字符数
    char tmp[2048] = 0;       //将文件内容读到此指针位置
    fp = fopen("./json_string.json", "r");   //打开文件
    fseek(fp, 0, SEEK_END);      //将文件指针指向该文件的最后
    file_size = ftell(fp);       //根据指针位置,此时可以算出文件的字符数(arnold:这个计算的时候貌似把回车符也计算进去了,但是读取保存的时候不会读回车符)
    printf("文件字符数为 %d\\n", file_size);
    fseek(fp, 0, SEEK_SET);                 //重新将指针指向文件首部
    if (file_size * sizeof(char) >= sizeof(tmp))    //arnold:在没有回车符的情况下,这样是百分百不会出错的
    
        printf("tmp太小,不够大\\n");
        return 0;
    
    fread(tmp, sizeof(char), file_size, fp); //开始读取整个文件
    printf("文件内容为:\\n%s", tmp);
    return 0;

VS上编译运行结果:

文件字符数为 141
文件内容为:

  "person": 
    "firstname": "z",
    "lastname": "jadena",
    "email": "jadena@126.com",
    "age": 8,
    "height": 1.17
  

ubuntu上编译运行结果:

[root@ubuntu /arnold_test/test]6# ./a.out 
文件字符数为 134
文件内容为:

  "person": 
    "firstname": "z",
    "lastname": "jadena",
    "email": "jadena@126.com",
    "age": 8,
    "height": 1.17
  

参考文章:C语言读出整个文件内容以及部分文件函数的讲解

做成了函数形式

#pragma warning(disable : 4996)
#include <stdio.h>

int read_json(FILE* fp, char* tmp, size_t size_tmp) 

    long file_size;   //保存文件字符数
    fseek(fp, 0, SEEK_END);      //将文件指针指向该文件的最后
    file_size = ftell(fp);       //根据指针位置,此时可以算出文件的字符数(arnold:这个计算的时候貌似把回车符也计算进去了,但是读取保存的时候不会读回车符)
    printf("文件字符数为 %d\\n", file_size);
    fseek(fp, 0, SEEK_SET);                 //重新将指针指向文件首部
    if (file_size * sizeof(char) >= size_tmp)    //arnold:在没有回车符的情况下,这样是百分百不会出错的
    
        printf("tmp太小,不够大\\n");
        return -1;
    
    fread(tmp, sizeof(char), file_size, fp); //开始读取整个文件
    return 0;


int main()    
    FILE* fp;
    char tmp[2048] = 0;       //将文件内容读到此指针位置
    fp = fopen("./json_string.json", "r");   //打开文件
    read_json(fp, tmp, sizeof(tmp));
    printf("文件内容为:\\n%s", tmp);
    return 0;

测试ftell()

(json_string)

a
b
c
d
e
f
g

windows上

文件字符数为 7
文件内容为:
a
b
c
文件字符数为 10
文件内容为:
a
b
c
d
文件字符数为 13
文件内容为:
a
b
c
d
e

ubuntu上

[root@ubuntu /arnold_test/test]8# ./a.out 
文件字符数为 14
文件内容为:
a
b
c
d
e
f
g

结论:ubuntu貌似会把最后一行换行符补全(没有换行也会补个换行),然后每行只计算一个换行符;windows最后一行不会补全换行符,每行会计算换行符和回车符

以上是关于C语言一次读取文件全部内容(注意:ftell()在windows上会把回车符计算在内,linux不会计算回车符,但相比windows,会自动补全最后一行的换行符)的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何获取文件大小?fseek() + ftell()

用c语言如何读取和保存jpg图片文件?

C语言 文件读写 ftell 函数

用C语言读取xml文件,怎么实现?

C 语言文件操作 ( ftell 函数 | 使用 ftell 函数获取当前指针位置 | 通过 ftell 计算文件大小 )

C语言文件操作问题,怎样替换文件中一行数据