在c中读取二进制文件直到文件结束

时间:2017-11-22 13:15:18

标签: c struct binary

我有一个二进制文件,其中包含一些行(我不知道究竟有多少),我想将这些行读入struct直到文件结尾,然后在new file.txt中重写这一行。 我的问题是:如何从二进制文件读取结构直到文件结尾?它只打印前11行。我必须为此或smth分配内存吗?

    struct linien
    {
        short x1, x2, y1, y2;
        unsigned char R, G, B;
    };


    FILE *fp; // pointer to a file type
    FILE *fpa; // pointer to a file type

    int counter;
    struct linien x; //x is a variable of type struct linien

    //open files - one for reading and another one for writing
    fp = fopen("\\Linien.pra", "rb");
    fpa = fopen("\\Linien.txt", "w");

    //check to see if files opened succesfully 
    if ((fp == NULL)||(fpa == NULL))
    {
        printf("file failed to open\n");
    }

for循环似乎无法正常工作。

    else
    {
        for (counter = 0; counter < sizeof(x); counter++) //print and write lines
        {
            //read the file Linien.pra
            fread(&x, sizeof(x), 1, fp);
            printf("%2d\t %3d\t %4d\t %5d\t %6d\t %7d  %8d\n", x.x1, x.x2, x.y1, x.y2, x.R, x.G, x.B);  
            //write struct linien to new file Linien.txt
            fprintf(fpa, "%2d\t %3d\t %4d\t %5d\t %6d\t %7d  %8d\n", x.x1, x.x2, x.y1, x.y2, x.R, x.G, x.B);
        }

        fclose(fp); // close file
        fclose(fpa); // close file
    }

3 个答案:

答案 0 :(得分:0)

你应该检查fread的返回值,这样就可以在while循环中使用fread:

http://website.loc/Belaya-cerkov/feedback/thank-you

答案 1 :(得分:0)

确保文件中的结构与结构linien匹配。 检查fread的返回值,检查是否到达文件的末尾。

答案 2 :(得分:0)

  

只打印前11行

让我们看看......

struct linien
{
    short x1, x2, y1, y2;
    unsigned char R, G, B;
};

int counter;
struct linien x;

// [...]

for (counter = 0; counter < sizeof(x); counter++)
{
    // code to read **one** instance of `struct linien`
}

看到什么?什么是sizeof(x)?我们在short中有4个char和3个struct linien - 假设您的典型平台short的大小(和对齐要求)为2,这使得总共2个* 4 + 3 = 11.惊喜? ;)

你出于什么原因正好循环了11次。所以你读(并写)11项!

相反,只有在fread()调用失败后才能停止(测试返回值!)。