【问题标题】:How can I load a whole file into a string in C [duplicate]如何将整个文件加载到C中的字符串中[重复]
【发布时间】:2011-12-12 23:49:47
【问题描述】:

可能重复:
Easiest way to get file's contents in C

我的程序读取跨越多行的文件。我想将文件的内容保存在一个字符串中。

我不知道执行前文件的行数,但我已将行大小固定为 MAX_LINE_LEN。

你怎么能这样做?

【问题讨论】:

  • 我猜这个已经被问了至少一百次了

标签: c string file


【解决方案1】:

函数fread() 不关心换行符。以下代码读取input_file_name的内容并将其保存到数组file_contents中:

char *file_contents;
long input_file_size;
FILE *input_file = fopen(input_file_name, "rb");
fseek(input_file, 0, SEEK_END);
input_file_size = ftell(input_file);
rewind(input_file);
file_contents = malloc(input_file_size * (sizeof(char)));
fread(file_contents, sizeof(char), input_file_size, input_file);
fclose(input_file);

如果input_file_name 包含\0 字符,您只能创建此数组的字符串。如果没有,请将最后三行更改为:

file_contents = malloc((input_file_size + 1) * (sizeof(char)));
fread(file_contents, sizeof(char), input_file_size, input_file);
fclose(input_file);
file_contents[input_file_size] = 0;

【讨论】:

  • +1 但是将long long改为size_t,或者至少使用longftell的实际返回类型。
  • 完成。感谢您的观察。 @rahmu:这意味着,如果sizeof(long) == 4,上述内容仅适用于小于 4 GiB 的文件。
  • 另外,最后一行不应该是file_contents[input_file_size + 1] = '\0'; 吗?
  • @Chris:不。大小为 2 的数组 a 具有元素 a[0]a[1]。同样,大小为input_file_size + 1 的数组file_contents 的最后一个元素是file_contents[input_file_size]。至于0\0,使用字符常量或其整数表示没有区别。
  • @Dennis:哦,对了,谢谢你的澄清 :)
【解决方案2】:

1) 用fstat计算文件的大小。

2) 分配这个长度 + 1 的零缓冲区

3) 使用fread 将文件内容读入缓冲区

【讨论】:

  • 4) 在末尾添加一个空终止符。 (编辑:好的,我看到你说“归零缓冲区”,但是如果你覆盖它,为什么还要花时间归零每个字节?这在现实生活中并不重要,但仍然如此。)
  • 公平点。尽管我认为缓冲区归零所花费的时间与 I/O 开销相比可以忽略不计,除非文件很大。用户可以将最后一个字节归零。
  • 如果您使用calloc,在大多数操作系统上它的速度将与malloc 相同,因为操作系统会在后台执行某些操作以确保内存清零(以确保@ 987654325@ 不会永远持续),但当然不能保证。
  • @James:当然,这就是为什么我说这在现实生活中并不重要。我只是习惯于在一个你计算每个周期的环境中工作,我忍不住挑剔:)
  • 文件大小在fstatfopen之间变化是多少?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2021-05-25
  • 2012-09-18
  • 2021-05-24
相关资源
最近更新 更多