使用 feof 读取整个文件并打印结果给我双端
Using feof to read whole file and print result give me double end
我有,我正在尝试读取二进制文件直到结束并打印结果,我正在使用并使用“feof”读取直到文件结束并打印每个结果,但我遇到了问题它给了我双重结果。
我还在学习 C,所以我不知道为什么它会给我双重结果,我尝试了很多方法,但这对我来说是最好的方法,也是最简单的方法,至少有效,但现在我在尝试修复 2 小时后卡住了。
结果:
0
1
2
3
4
5
6
7
8
9
9
预计:
0
1
2
3
4
5
6
7
8
9
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
// https://www.aprendeaprogramar.com/cursos/verApartado.php?id=16007
struct Datos
{
int cero;
int uno;
int dos;
int tres;
int cuatro;
int cinco;
int seis;
int siete;
int ocho;
int nueve;
};
struct Datos datosEscrito = {0,1,2,3,4,5,6,7,8,9};
FILE *fichero;
fichero = fopen("tabla2.dat", "wb");
fwrite(&datosEscrito, sizeof(datosEscrito), 1, fichero);
fclose(fichero);
int datoLeido;
FILE *fichero2;
fichero2 = fopen("tabla2.dat", "rb");
while (!feof(fichero2))
{
fread(&datoLeido, sizeof(datoLeido), 1, fichero2);
printf("%u", datoLeido);
printf("\n");
}
fclose(fichero2);
}
PD:我不想要代码修复,我想了解为什么给我双端和一种自己修复错误的方法,或者另一种方法来做同样的事情。感谢您的帮助。
代码编辑:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fichero;
fichero = fopen("tabla2.dat", "wb");
int count=0;
while (count != 10)
{
fwrite(&count, sizeof(count), 1, fichero);
count++;
}
fclose(fichero);
// PARTE LEER
int datoLeido;
FILE *fichero2;
fichero2 = fopen("tabla2.dat", "rb");
while (!feof(fichero2))
{
fread(&datoLeido, sizeof(datoLeido), 1, fichero2);
printf("%u", datoLeido);
printf("\n");
}
fclose(fichero2);
return 0;
}
你的程序中的主要问题是当 previous fread
(或其他读操作) 检测到文件结束条件,并且即使 fread
会通过它的 return 值告诉您它没有读取任何数据,您仍然使用该值。
函数 feof
和 ferror
用于区分 EOF 和错误 在 文件操作失败后。
要修复读取循环,您可以使用例如
do
{
/* we expect to read 1 member */
if(fread(&datoLeido, sizeof(datoLeido), 1, fichero2) == 1)
{
printf("%u", datoLeido);
printf("\n");
}
} while ((!feof(fichero2)) && !ferror(fichero2));
您的代码中还有更多问题。
格式%u
对应类型unsigned int
。对于 int
你应该使用 %d
.
您将结构 struct Datos
的二进制表示写入文件,然后读回 int
.
类型的单个值
虽然这似乎在您的案例中产生了预期的结果,但在其他情况下可能不起作用。结构可以包含不属于任何结构字段的填充字节。这些将具有未定义的值。在任何情况下 writing/reading 变量的二进制表示是依赖于实现的。当您使用不同的编译器(新版本、不同的 OS、不同的 CPU...)甚至不同的编译器设置时,数据格式可能会发生变化。
我能够“修复”这个问题,但我认为这是一个肮脏的修复,但至少有效:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fichero;
fichero = fopen("tabla2.dat", "wb");
int count=0;
while (count != 10)
{
fwrite(&count, sizeof(count), 1, fichero);
count++;
}
fclose(fichero);
// PARTE LEER
int datoLeido;
FILE *fichero2;
fichero2 = fopen("tabla2.dat", "rb");
while (!feof(fichero2))
{
fread(&datoLeido, sizeof(datoLeido), 1, fichero2);
if(!feof(fichero2))
{
printf("%d", datoLeido);
printf("\n");
}
}
fclose(fichero2);
return 0;
}
感谢大家的帮助,@David Schwartz 在阅读后给了我提示,我没有在打印数据之前检查文件是否结束
我有,我正在尝试读取二进制文件直到结束并打印结果,我正在使用并使用“feof”读取直到文件结束并打印每个结果,但我遇到了问题它给了我双重结果。
我还在学习 C,所以我不知道为什么它会给我双重结果,我尝试了很多方法,但这对我来说是最好的方法,也是最简单的方法,至少有效,但现在我在尝试修复 2 小时后卡住了。
结果:
0
1
2
3
4
5
6
7
8
9
9
预计:
0
1
2
3
4
5
6
7
8
9
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
// https://www.aprendeaprogramar.com/cursos/verApartado.php?id=16007
struct Datos
{
int cero;
int uno;
int dos;
int tres;
int cuatro;
int cinco;
int seis;
int siete;
int ocho;
int nueve;
};
struct Datos datosEscrito = {0,1,2,3,4,5,6,7,8,9};
FILE *fichero;
fichero = fopen("tabla2.dat", "wb");
fwrite(&datosEscrito, sizeof(datosEscrito), 1, fichero);
fclose(fichero);
int datoLeido;
FILE *fichero2;
fichero2 = fopen("tabla2.dat", "rb");
while (!feof(fichero2))
{
fread(&datoLeido, sizeof(datoLeido), 1, fichero2);
printf("%u", datoLeido);
printf("\n");
}
fclose(fichero2);
}
PD:我不想要代码修复,我想了解为什么给我双端和一种自己修复错误的方法,或者另一种方法来做同样的事情。感谢您的帮助。
代码编辑:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fichero;
fichero = fopen("tabla2.dat", "wb");
int count=0;
while (count != 10)
{
fwrite(&count, sizeof(count), 1, fichero);
count++;
}
fclose(fichero);
// PARTE LEER
int datoLeido;
FILE *fichero2;
fichero2 = fopen("tabla2.dat", "rb");
while (!feof(fichero2))
{
fread(&datoLeido, sizeof(datoLeido), 1, fichero2);
printf("%u", datoLeido);
printf("\n");
}
fclose(fichero2);
return 0;
}
你的程序中的主要问题是当 previous fread
(或其他读操作) 检测到文件结束条件,并且即使 fread
会通过它的 return 值告诉您它没有读取任何数据,您仍然使用该值。
函数 feof
和 ferror
用于区分 EOF 和错误 在 文件操作失败后。
要修复读取循环,您可以使用例如
do
{
/* we expect to read 1 member */
if(fread(&datoLeido, sizeof(datoLeido), 1, fichero2) == 1)
{
printf("%u", datoLeido);
printf("\n");
}
} while ((!feof(fichero2)) && !ferror(fichero2));
您的代码中还有更多问题。
格式
%u
对应类型unsigned int
。对于int
你应该使用%d
.您将结构
struct Datos
的二进制表示写入文件,然后读回int
.
类型的单个值 虽然这似乎在您的案例中产生了预期的结果,但在其他情况下可能不起作用。结构可以包含不属于任何结构字段的填充字节。这些将具有未定义的值。在任何情况下 writing/reading 变量的二进制表示是依赖于实现的。当您使用不同的编译器(新版本、不同的 OS、不同的 CPU...)甚至不同的编译器设置时,数据格式可能会发生变化。
我能够“修复”这个问题,但我认为这是一个肮脏的修复,但至少有效:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fichero;
fichero = fopen("tabla2.dat", "wb");
int count=0;
while (count != 10)
{
fwrite(&count, sizeof(count), 1, fichero);
count++;
}
fclose(fichero);
// PARTE LEER
int datoLeido;
FILE *fichero2;
fichero2 = fopen("tabla2.dat", "rb");
while (!feof(fichero2))
{
fread(&datoLeido, sizeof(datoLeido), 1, fichero2);
if(!feof(fichero2))
{
printf("%d", datoLeido);
printf("\n");
}
}
fclose(fichero2);
return 0;
}
感谢大家的帮助,@David Schwartz 在阅读后给了我提示,我没有在打印数据之前检查文件是否结束