【发布时间】:2011-12-12 23:49:47
【问题描述】:
我的程序读取跨越多行的文件。我想将文件的内容保存在一个字符串中。
我不知道执行前文件的行数,但我已将行大小固定为 MAX_LINE_LEN。
你怎么能这样做?
【问题讨论】:
-
我猜这个已经被问了至少一百次了
我的程序读取跨越多行的文件。我想将文件的内容保存在一个字符串中。
我不知道执行前文件的行数,但我已将行大小固定为 MAX_LINE_LEN。
你怎么能这样做?
【问题讨论】:
函数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;
【讨论】:
long long改为size_t,或者至少使用long,ftell的实际返回类型。
sizeof(long) == 4,上述内容仅适用于小于 4 GiB 的文件。
file_contents[input_file_size + 1] = '\0'; 吗?
a 具有元素 a[0] 和 a[1]。同样,大小为input_file_size + 1 的数组file_contents 的最后一个元素是file_contents[input_file_size]。至于0 与\0,使用字符常量或其整数表示没有区别。
1) 用fstat计算文件的大小。
2) 分配这个长度 + 1 的零缓冲区
3) 使用fread 将文件内容读入缓冲区
【讨论】:
calloc,在大多数操作系统上它的速度将与malloc 相同,因为操作系统会在后台执行某些操作以确保内存清零(以确保@ 987654325@ 不会永远持续),但当然不能保证。
fstat和fopen之间变化是多少?