【发布时间】:2020-07-15 03:09:44
【问题描述】:
所以我有这个代码
FILE* file = fopen("file.txt", "r");
if(file == NULL)
{
printf("Failed to open file.\n");
return NULL;
}
fseek(file, 0L, SEEK_END);
long bufferSize = ftell(file);
fseek(file, 0L, SEEK_SET);
char* buffer = (char*) malloc(bufferSize);
if(buffer == NULL)
{
printf("Failed to allocate memory for buffer.\n");
return NULL;
}
fread(buffer, sizeof(char), bufferSize, file);
fclose(file);
当使用 printf("%s", buffer) 打印到控制台时,这似乎工作得非常好,但我想知道这是否应该导致缓冲区溢出或者它是否错误,因为最后似乎没有空终止符. 让我们假设 file.txt 中正好有 4 个字符。当 bufferSize 被计算出来时,它的值为 4终止符。我到处都看到人们阅读整个文本文件的例子,他们使用这样的代码,但这不应该是用文件中的字符创建一个 char* 而没有结束空终止符吗?我应该使用 malloc(bufferSize + 1) 分配这个缓冲区并添加一个空终止符吗?
【问题讨论】:
-
正如您所想的那样,仅使用
printf并不是一个好主意,因为您根本不知道\0是否被读取。所以我会分配bufferSize+1字节并手动设置buffer[bufferSize] = 0,然后你就可以放心使用printf了。 -
OT: about:
printf("Failed to open file.\n");错误信息应该输出到stderr,而不是stdout。当错误指示来自 C 库函数时,还应输出系统认为发生错误的文本原因。建议:perror( "Failed to open file." );
标签: c