1

私の質問は、最後のレジストリを 2 回繰り返す while(!feof(arch)) に関するものです。お時間を割いてご回答いただきありがとうございます。基礎を学んでいる1年生です。

情報はアーカイブにあるため、最初の入力は初めてではないため、最初の入力は 's' であってはなりません。次に、プログラムは情報を一覧表示しますが、最後のレジストリは 2 回繰り返されます。

#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);
}
4

1 に答える 1

1

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()があることを意味するため、次の 2 つの良い使用方法があります。feof()

 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++;
 }
于 2014-11-25T00:42:17.563 に答える