C中读取文件不清楚

时间:2014-06-24 18:07:28

标签: c file io

我尝试在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);
}

1 个答案:

答案 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;
}