1

問題があります。次のような内容のテキスト ファイル studenti.txt を作成しました。

  1. Gatis Lietnieks 15.06.1993 v
  2. ビズマ・カレスニカ 20.08.1991 s
  3. カトリーナ・サボーン 06.12.1992 秒
  4. Haralds Burkovskis 01.02.1989 v
  5. Jezups Martinovs 02.05.1990 v
  6. ビズマ・ジグルデ 1988.09.16
  7. Stasija Balode 12.12.1993 s
  8. Jānis Bērziņš 13.03.1992 v
  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. アンドレイス・フォムキンス 11.06.1989 v
  14. Maikls Dzordans 08.01.1988 v

そして、このファイルを読み込んで、ファイルの内容を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 が動作を停止しました.....」と停止するだけで、コードのどこに間違いがあるのか​​ 疑問に思っています。

4

1 に答える 1

5

のドキュメントを読んでくださいfscanf()。使い方が間違っています。変換するデータを保存する場所のアドレスを渡す必要がありますfscanf()。他にどのように変数に書き込むことができると思いますか?

言い換えれば、これは:

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

次のようにする必要があります。

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

where&は C の「アドレス」演算子で、式のアドレスに評価されます。

別の問題は、strlen()初期化されていない文字列で使用することです。これは有効ではありません。あなたが意味したのは:

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

また、I/O 呼び出しが失敗する可能性があることも忘れないでください。戻り値を確認する必要があります。

于 2013-11-13T13:27:43.367 に答える