c中的结构和文件

时间:2013-11-13 13:14:28

标签: c data-structures char structure

我有一些问题。我创建了文本文件studenti.txt,内容如下:

  1. Gatis Lietnieks 15.06.1993 v
  2. Vizma Kalesnica 20.08.1991 s
  3. Katrina Sabone 06.12.1992 s
  4. Haralds Burkovskis 01.02.1989 v
  5. Jezups Martinovs 02.05.1990 v
  6. Vizma Zigurde 16.09.1988 s
  7. Stasija Balode 12.12.1993 s
  8. JānisBērziņš13.03.1992v
  9. Zigurds Ritms 16.05.1991 v
  10. Pauls Zirdzins 12.11.1989 v
  11. Zane Skarbule 28.12.19990 s
  12. Aiga Bulle 11.08.1993 s
  13. Andrejs Fomkins 11.06.1989 v
  14. Maikls Dzordans 08.01.1988 v
  15. 我想阅读此文件并在c程序中打印文件的内容。 我的代码是这样的:

     #include <stdio.h>
     #include <conio.h>
     #include <string.h>
     #include <windows.h>
     #define N 16
     int main()
     {
     FILE *fails_st;
    
     struct date
     { int da_year;
       int da_month;
       int da_day;
     };
    
     struct studenti
     {
     int Nr;
     char name[25];
     char surname[25];
     struct date dzd;
     char dzimums[10]; 
     } students[N];
    
     int i, j;
     system("cls");
    
     fails_st = fopen("studenti.txt", "r");
     for(i=0; i<N; i++)
     {
     fscanf(fails_st, "%d", students[i].Nr);
     fgets(students[i].name, strlen(students[i].name)+1, fails_st);
     fgets(students[i].surname, strlen(students[i].surname)+1, fails_st);
     fscanf(fails_st, "%d", students[i].dzd.da_day);
     fscanf(fails_st, "%d", students[i].dzd.da_month);
     fscanf(fails_st, "%d", students[i].dzd.da_year);
     fgets(students[i].dzimums, strlen(students[i].dzimums)+1, fails_st);
     }
     fclose(fails_st);
     system("cls");
     printf("Student list\n");
     for(i=0; i<N; i++)
     printf("%4d%15s%15s%d%d%d%%4s\n", students[i].Nr, 
     students[i].name, students[i].surname, 
     students[i].dzd.da_day,students[i].dzd.da_month,students[i].dzd.da_year,students[i].dzimums);
     getch();
     return 0;
     }
    

    但是当我运行程序时,只需停止“myfilename.exe已停止工作...........” 我想知道我的代码中的错误在哪里。

1 个答案:

答案 0 :(得分:5)

请阅读fscanf()的文档,您使用的是错误的。您必须传递您希望fscanf()存储所转换数据的地址:您希望它如何能够在您的变量中写入?

换句话说,这个:

fscanf(fails_st, "%d", students[i].Nr);

应该是:

fscanf(fails_st, "%d", &students[i].Nr);

其中&是C&#34;&#34;&#34; -operator的地址,其计算表达式的地址。

另一个问题是您对未初始化的字符串使用strlen(),这是无效的。你的意思是:

fgets(students[i].name, sizeof students[i].name, fails_st);

还要记住,I / O调用可能会失败,你真的应该检查返回值。