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
做成了函数形式
#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 语言文件操作 ( ftell 函数 | 使用 ftell 函数获取当前指针位置 | 通过 ftell 计算文件大小 )