可能是重复问题:
在C中获取文件内容的最简单方法
我的程序读取跨越许多行的文件。我想将文件内容保存在单个字符串中。
我不知道执行之前文件的行数,但是我已将每行大小固定为MAX_LINE_LEN。
你可以如何做到这一点?
可能是重复问题:
在C中获取文件内容的最简单方法
我的程序读取跨越许多行的文件。我想将文件内容保存在单个字符串中。
我不知道执行之前文件的行数,但是我已将每行大小固定为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;
file_contents[input_file_size + 1] = '\0';
吗? - Chrisa
有元素a[0]
和a[1]
。同样,大小为input_file_size + 1
的数组file_contents
的最后一个元素是file_contents[input_file_size]
。至于0
与\0
,使用字符常量或其整数表示没有区别。 - Dennisbytes_read = fread(...);
file_contents[bytes_read] = 0;
- John1) 使用 fstat
函数确定文件大小。
2) 分配一个长度为文件大小加 1 的零填充缓冲区。
3) 使用 fread
函数将文件内容读入缓冲区。
calloc
,在大多数操作系统上它的速度与malloc
相同,因为操作系统会在后台执行某些操作以确保内存被清零(以确保calloc(8 * getpagesize())
不会花费太长时间),但这当然并不是保证。 - Chris Lutzfstat
和fopen
之间的文件大小会发生变化吗? - joeytwiddle