我尝试在100字节的缓冲区中循环读取文件。 当我第一次读取文件时 - 缓冲区已满。返回值为0.没有错误且没有eof(函数“ferror”和“feof”表示没有错误)。然后我尝试第二次读取文件,并再次返回值为0,没有错误,没有eof。但后来我有空缓冲区。我不知道是什么问题?
if(fopen_s(&file_in, argv[1], "rb") == 0){
printf("File was opened.\n");
while(!feof(file_in)){
read_code = fread_s(file_data, 100, sizeof(unsigned char), 100, file_in);
if(ferror(file_in)) {
printf("Error!\n");
}
if(feof(file_in)) {
printf("Eof!\n");
}
printf("Read result: %d\n", read_code);
/*Using the buffer*/
memset(file_data, 0, 100);
}
fclose(file_in);
}
答案 0 :(得分:1)
由于有关fopen_s,et。的评论中给出的原因。以下是使用getc()
读取二进制文件的替代实现,以及fopen()
,fclose()
等。(我没有使用Microsoft实现,但使用的是ANSI C99 )
它有一个评论部分我用来创建一个测试二进制文件。除此之外,它会调整您正在读取的文件的大小,以便您可以分配适量的内存,然后将二进制数据读入缓冲区。
要导航文件 ,请查看fseek()
及其stdio.h定义的参数:
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
在此示例中,在退出之前,所有内容都已关闭或释放:
#include <windows.h>
#include <ansi_c.h>
long int getFileSizeFromPath(char * path)
{
FILE * file;
long int fileSizeBytes = 0;
file = fopen(path,"r");
if(file){
fseek(file, 0, SEEK_END);
fileSizeBytes = ftell(file);
fseek(file, 0, SEEK_SET);
fclose(file);
}
return fileSizeBytes;
}
int main(int argc, char *argv[])
{
FILE *fp=0;
char *binBuf;
long int size=0;
int i=0;
int byte=0;
//create 100 byte test file (c:\\dev\\tessst.bin)
// fp = fopen(argv[1], "wb");
//
// srand(clock());
// for(i=0;i<100;i++)
// {
// byte = rand();
// putc(byte, fp);
// }
// putc(EOF, fp);
//
// fclose(fp);
size = getFileSizeFromPath(argv[1]);
binBuf = calloc(size + 1, sizeof(char));
fp = fopen(argv[1], "rb");
byte = getc(fp);
while(byte != EOF)
{
binBuf[i++] = (char)byte;
byte = getc(fp);
}
fclose(fp);
free(binBuf);
return 0;
}