C 为什么最后一次迭代会重复?

C 为什么最后一次迭代会重复?,c,feof,C,Feof,我的问题是指while(!feof(arch))重复上一个注册表两次。如果你花点时间回答,谢谢。我在第一年学习基础知识 信息在存档中,因此第一次输入不应该是“s”,因为这不是第一次输入。然后程序列出信息,但最后一个注册表重复两次 #include <stdio.h> typedef struct{ int legajo; char nombre[30]; int ingreso; int pparcial; int sparcial; } r

我的问题是指while(!feof(arch))重复上一个注册表两次。如果你花点时间回答,谢谢。我在第一年学习基础知识

信息在存档中,因此第一次输入不应该是“s”,因为这不是第一次输入。然后程序列出信息,但最后一个注册表重复两次

#include <stdio.h>

typedef struct{
    int legajo;
    char nombre[30];
    int ingreso;
    int pparcial;
    int sparcial;
} reg_alumno;

reg_alumno funcionleer(void);

typedef FILE * archivo; //Se define el tipo de dato "archivo".

archivo arch; //Se declara una variable de archivo.

int main(void){
    reg_alumno alumno,alu;
    int ca,i,j=0;
    char respuesta;
    printf("Desea ingresar datos por primera vez?");
    scanf("%c",&respuesta);
    printf("Ingrese cantidad alumnos");
    scanf("%d",&ca); //Pide cantidad alumnos
    if(respuesta=='s'){
        arch = fopen("alumnos.dat","w"); //Crear archivo para escribir, crea si no existe)
        for(i=0;i<ca;i++){
            alumno = funcionleer(); //Lee alumno
            fseek(arch,sizeof(reg_alumno)*i,SEEK_SET); //Busca la última posición del archivo
            fwrite(&alumno,sizeof(reg_alumno),1,arch); //Escribe en la última posición 
        }
    }
    else{
        arch = fopen("alumnos.dat","r+");
        while(!feof(arch)){
            fseek(arch,sizeof(reg_alumno)*j,SEEK_SET); //Pasa de registro en registro(alumno en     alumno).
            fread(&alu,sizeof(reg_alumno),1,arch); //Trae a la memoria principal un alumno
            printf("Legajo N %d: %s\n",alu.legajo,alu.nombre);
            j++;
        }
    }
fclose(arch); //Cierra el archivo
}

reg_alumno funcionleer(void){ //Función leer
    reg_alumno alumno;
    printf("Ingrese el numero de legajo:\n");
    scanf("%d",&alumno.legajo);
    printf("Ingrese el nombre:\n");
    scanf("%s",alumno.nombre);
    return(alumno);
}
#包括
类型定义结构{
国际乐加霍;
字符名称[30];
int Ingreo;
内部程序;
内部空间;
}注册大学校友;
注册校友职能(无效);
typedef文件*archivo//请定义dato的“archivo”。
拱门//Se declara una variable de archivo。
内部主(空){
reg_校友,校友;
int-ca,i,j=0;
char respuesta;
printf(“Desea Ingrear datos por primera vez?”);
scanf(“%c”和“respuesta”);
printf(“安格尔康蒂达校友”);
scanf(“%d”、&ca);//Pide cantidad校友
如果(respuesta=='s'){
arch=fopen(“校友日”,“w”);//Crear archivo para describir,crea si no existe)

对于(i=0;i很好地检查WhozCraig的IO操作结果

代码的问题是,即使
fread()
失败,它也会打印

// No check of return value.
fread(&alu,sizeof(reg_alumno),1,arch);
printf("Legajo N %d: %s\n",alu.legajo,alu.nombre);
代码不正确地使用了feof()
。很多人都在这方面发帖

由于OP暗示老师要求代码使用
feof()
:以下是使用
feof()


如果
fseek
fread
失败,而不是
while(!feof)
,则中止循环。您从未递增“j”。可能我不明白。在上述情况下(您使用feof和while),您能用for循环而不是feof向我显示代码吗您永远不会到达文件的结尾,因为您总是设置为文件的开头;可能是for循环出现了类似的问题,但我不确定您来自何处,因为for循环不一定使用feof。不要使用
feof
来确定何时终止输入循环。而是检查值r由您调用的所有输入函数启动,如果其中一个函数失败,则终止循环。请检查每个函数的文档,查看它如何报告失败。首先,如果存在输入错误,
ferror()
将变为true,但
feof()
不会,这会给您一个无限循环。使用
feof()
和/或
ferror()
循环终止后,告诉您它终止的原因。
 for (;;) {
   if (fseek(arch,sizeof(reg_alumno)*j,SEEK_SET)) break;
   if (fread(&alu,sizeof(reg_alumno),1,arch) == 0) break;
   printf("Legajo N %d: %s\n",alu.legajo,alu.nombre);
   j++;
 }
 // If loop quit because of EOF
 if (feof(arch)) printf("Success");
 else if (!ferror(arch)) printf("IO Error");
 for (;;) {
   if (fseek(arch,sizeof(reg_alumno)*j,SEEK_SET)) break;
   fread(&alu,sizeof(reg_alumno),1,arch);
   if (!feof(arch)) break;
   if (!ferror(arch)) break;
   printf("Legajo N %d: %s\n",alu.legajo,alu.nombre);
   j++;
 }