用C打开和读取文件

时间:2015-11-10 14:23:33

标签: c

我必须在C上编写一个打开文件的应用程序,读取其中的内容,将该信息存储在结构中并打印所有信息。我创建了"empleados.txt"并将其放在main.c的文件夹中。这是.txt

的内容
Juan
Perez
Rodriguez
11111111A
1200
Pepa
Bueno
Ruibal
22222222B
2300

它不打印任何东西,我不知道为什么。

#include <stdio.h>
#include <stdlib.h>

struct Empleado {
    char nombre[15];
    char apellido_uno[30];
    char apellido_dos[30];
    char DNI[9];
    unsigned int sueldo;
};

int main() {
    int i=0, j;
    struct Empleado num[50];
    FILE *idf;
    idf=fopen("empleados.txt", "rt");
    if (idf==NULL){
        printf("Error abriendo fichero ...");
        exit(1);
    }
    else {
        do{
            fgets(idf,"%s",&num[i].nombre);
            fgets(idf,"%s",&num[i].apellido_uno);
            fgets(idf,"%s",&num[i].apellido_dos);
            fgets(idf,"%s",&num[i].DNI);
            fgets(idf,"%d",&num[i].sueldo);                
            i++;
        }while(feof(idf)==0);
    }
    fclose (idf);

    for(j=0;j<i;j++){
        printf("Nombre: %s",num[i].nombre);
        printf("Nombre: %s",num[i].apellido_uno);
        printf("Nombre: %s",num[i].apellido_dos);
        printf("Nombre: %s",num[i].DNI);
        printf("Nombre: %o",num[i].sueldo);        
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

fgets希望将文件作为最后一个参数,将目标字符串作为第一个参数。

第二个参数应该是目标缓冲区的大小,而不是格式字符串。

您似乎对fgetsfscanf感到困惑。

这是一个改进版本(还包含BLUEPIXY的索引修复):

#include <stdio.h>
#include <stdlib.h>

struct Empleado {
    char nombre[15];
    char apellido_uno[30];
    char apellido_dos[30];
    char DNI[9];
    unsigned int sueldo;
};

int main() {
    int i=0, j;
    struct Empleado num[50];
    FILE *idf;
    idf=fopen("empleados.txt", "rt");
    if (idf==NULL){
        printf("Error abriendo fichero ...");
        exit(1);
    }
    else {
        do{
            fgets(&num[i].nombre, sizeof num[i].nombre, idf);
            fgets(&num[i].apellido_uno, sizeof num[i].apellido_uno, idf);
            fgets(&num[i].apellido_dos, sizeof num[i].apellido_dos, idf);
            fgets(&num[i].DNI, sizeof num[i].DNI, idf);
            fscanf(idf, "%u", &num[i].sueldo);
            i++;
        }while(feof(idf)==0);
    }
    fclose (idf);

    for(j=0;j<i;j++){
        printf("Nombre: %s\n",num[j].nombre);
        printf("Nombre: %s\n",num[j].apellido_uno);
        printf("Nombre: %s\n",num[j].apellido_dos);
        printf("Nombre: %s\n",num[j].DNI);
        printf("Nombre: %o\n",num[j].sueldo);        
    }

    return 0;
}

答案 1 :(得分:1)

fgets更改为fscanf,并从&循环中的参数中删除do-whilenum[i].nombre转换为指向char的指针,类似于除最后一个成员sueldo之外的其他成员。

    fscanf(idf,"%s",num[i].nombre);
    fscanf(idf,"%s",num[i].apellido_uno);
    fscanf(idf,"%s",num[i].apellido_dos);
    fscanf(idf,"%s",num[i].DNI);
    fscanf(idf,"%d",&num[i].sueldo);
    i++;