char *loadTextFile(const char *filename)
{
FILE *fileh;
char *text = 0;
long filelength;
if((fileh=fopen(filename,"rb"))== 0)
printf("loadTextFile() - could not open file");
else
{
fseek(fileh, 0, SEEK_END);
filelength = ftell(fileh);
rewind(fileh);
text=(char *) smartmalloc((int)filelength + 1);
fread(text,(int)filelength, 1, fileh);
fclose(fileh);
text[filelength]=0;
}
printf(text);
return(text);
}
此函数仅返回txt文件的部分数据。它也是不一致的... soemtimes在20次给我100个字符的文件。我没有看到它有什么问题。以为我可能会看到另一双眼睛。感谢。
答案 0 :(得分:4)
要检查的明显事项:
ftell(fileh)给你带来了什么?
文件中是否可以嵌入NUL字符?这会导致printf(文本)过早停止。
答案 1 :(得分:3)
这是稍微更好的代码版本。您需要使用IO函数调用进行更多错误检查。此外,还有令人讨厌的long
到size_t
隐式转换,我建议您在生产代码中正确处理。
char* loadTextFile(const char *filename) {
char *text;
long length;
FILE *fileh = fopen(filename, "rb");
if ( !fileh ) {
return NULL;
}
fseek(fileh, 0, SEEK_END);
length = ftell(fileh);
rewind(fileh);
text = malloc(length + 1);
if ( !text ) {
return NULL;
}
fread(text, 1, length, fileh);
text[length] = 0;
fclose(fileh);
return text;
}
请注意,John R. Strohm是正确的:如果您对已阅读内容的评估基于printf
打印的内容,则您可能会被嵌入式nul
误导。
答案 2 :(得分:3)
fread
无法保证返回您要求的字符数。您需要检查其返回值并在循环中使用它。
示例循环(未测试):
char *p = text;
do {
size_t n = fread(p,1,(size_t)filelength, fileh);
if (n == 0) {
*p = '\0';
break;
}
filelength -= n;
p += n;
} while (filelength > 0);
n==0
的测试捕获了一些其他进程在您尝试读取时截断文件的情况。