我正在尝试编写一个bittorrent客户端。为了解析文件等,我需要将torrent文件读入内存。我注意到fread没有将整个文件读入我的缓冲区。经过进一步调查后,似乎只要在文件中遇到如下所示的符号,fread就会停止读取文件。在FILE *指针上调用feof函数会返回16,表示已到达文件末尾。无论符号放在何处,都会发生这种情况。有人可以解释为什么会发生这种情况以及任何可行的解决方案。
下面突出显示符号:
以下是执行读取操作的代码:
char *read_file(const char *file, long long *len){
struct stat st;
char *ret = NULL;
FILE *fp;
//store the size/length of the file
if(stat(file, &st)){
return ret;
}
*len = st.st_size;
//open a stream to the specified file
fp = fopen(file, "r");
if(!fp){
return ret;
}
//allocate space in the buffer for the file
ret = (char*)malloc(*len);
if(!ret){
return NULL;
}
//Break down the call to fread into smaller chunks
//to account for a known bug which causes fread to
//behave strangely with large files
//Read the file into the buffer
//fread(ret, 1, *len, fp);
if(*len > 10000){
char *retTemp = NULL;
retTemp = ret;
int remaining = *len;
int read = 0, error = 0;
while(remaining > 1000){
read = fread(retTemp, 1, 1000, fp);
if(read < 1000){
error = feof(fp);
if(error != 0){
printf("Error: %d\n", error);
}
}
retTemp += 1000;
remaining -= 1000;
}
fread(retTemp, 1, remaining, fp);
} else {
fread(ret, 1, *len, fp);
}
//cleanup by closing the file stream
fclose(fp);
return ret;
}
感谢您的时间:)
答案 0 :(得分:5)
你的问题很奇怪,因为我最近在上周的工作中遇到了这个问题!
此字符的ASCII值为十进制26(0x1A,\ SUB,SUBSTITUTE)。这用于表示CTRL + Z键序列或文件结束标记。
更改您的fopen
mode(“在[文本]模式下,CTRL + Z被解释为输入时的文件结束字符。”)在Windows上解决此问题:
fp = fopen(file, "rb"); /* b for 'binary', disables Text-mode translations */
答案 1 :(得分:4)
您应该以二进制模式打开文件。某些平台在文本(默认)模式下将某些字节解释为文件标记的物理结束。
答案 2 :(得分:4)
您是以文本而不是原始/二进制模式打开文件 - 箭头是EOF的ASCII。为你的fopen电话指定“rb”而不仅仅是“r”。