c - c 中的结构和文件

标签 c data-structures char structure

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

  1. Gatis Lietnieks 15.06.1993 v
  2. Vizma Kalesnica 20.08.1991 s
  3. 卡特里娜飓风 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 1993 年 12 月 12 日
  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. Andrejs Fomkins 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 已停止工作......” 我想知道我的代码中的错误在哪里。

最佳答案

请阅读 fscanf() 的文档,你用错了。您必须传递您希望 fscanf() 存储它转换的数据的地址:您还希望它如何写入您的变量?

换句话说,这:

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

应该是:

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

其中 & 是 C 的“address of”运算符,计算结果为表达式的地址。

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

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

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

关于c - c 中的结构和文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19954788/

相关文章:

c - 使用 getchar();定义多个变量

c - 为什么第二个函数没有运行和/或产生输出? (Linux 中的 C)

c - 如何在 x86 DOS 程序集中读取没有 "consuming"的键盘输入?

使用 O(1) 插入操作创建邻接表

c++ - 从 char 到 string 的无效转换

c++ - ANSI代码页中wchar_t char之间的转换

c - C语言如何对数组进行排序但保留重复元素的位置?

c - 检索节点原始字符串

c++ - 按字母顺序然后按长度对字符数组进行排序

c - 是否应该将所有预期从二进制文件中读取的结构标记为已打包?