gpt4 book ai didi

c - 为什么最后一次迭代重复?

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:53 27 4
gpt4 key购买 nike

我的问题是指 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);
}

最佳答案

很高兴检查 IO 操作的结果@WhozCraig。

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

// No check of return value.
fread(&alu,sizeof(reg_alumno),1,arch);
printf("Legajo N %d: %s\n",alu.legajo,alu.nombre);

代码错误地使用了 feof()。许多 SO 帖子。

由于 OP 暗示老师需要代码才能使用 feof():以下是使用 feof() 的 2 种好方法/p>

 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++;
}

关于c - 为什么最后一次迭代重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27115922/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com