我必须在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;
}
答案 0 :(得分:2)
fgets
希望将文件作为最后一个参数,将目标字符串作为第一个参数。
第二个参数应该是目标缓冲区的大小,而不是格式字符串。
您似乎对fgets
和fscanf
感到困惑。
这是一个改进版本(还包含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-while
。 num[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++;