我有一个二进制文件,其中包含一些行(我不知道究竟有多少),我想将这些行读入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
}
答案 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()
调用失败后才能停止(测试返回值!)。