【发布时间】:2018-01-18 20:22:37
【问题描述】:
我在c中练习文件的主题,目前正在学习基础知识,也就是说我并不控制语言内置的所有功能,并且在一些命令中,所以如果你能根据基本命令解释一下复杂的我会感谢你的。
程序的作用: 吸收学生资料(身份证、姓名、电话),并在文件中打印每个学生的资料(每个学生的资料都会写在新的一行)
我的代码有什么问题: 我写了一个打印文件中所有数据的函数,如果用户插入了多个学生,该函数只打印文件中的第一行,就是这样。
当我使用 F10 时,我进入了循环,第一次运行打印出第一个学生的详细信息,然后第二次运行,fscanf 命令返回一个值 (-1),并且没有打印出学生的详细信息第二个学生。
我很乐意指导和纠正。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct studnt
{
int id;
int number;
char *name;
}typedef s_studnt;
void print_studnt(FILE *q,char name_file[])
{
int id, number;
char str_name[20];
q=fopen(name_file, "r");
if (q == NULL)
{
printf("eror fac\n");
return;
}
printf("\n");
while (!feof(q))
{
fscanf(q, "%d %s %d", &id, str_name, &number); //at the next loop, fscanf return -1
printf("studnt name:%s\nthe id studnt:%d\ntelephon number:%d\n", str_name, id, number);
printf("\n");
}
fclose(q);
return;
}
int main()
{
int size, i, length;
char str[20], name_file[20];
FILE *q = NULL;
s_studnt *studnt = NULL;
printf("how much studnt you have:\n");
scanf("%d", &size);
studnt = (s_studnt*)malloc(size * sizeof(s_studnt));
if (studnt == NULL)
{
printf("eror 1\n");
return 0;
}
printf("enter file name:\n");
scanf("%s", name_file);
q = fopen(name_file, "w");
if (q == NULL)
{
printf("eror file\n");
return 0;
}
fclose(q);
for (i = 0; i < size; i++)
{
printf("enter studnt name:\n");
scanf("%s", str);
length = strlen(str);
studnt[i].name = (char*)malloc(length+1 * sizeof(char));
if (studnt[i].name == NULL)
{
printf("eror2\n");
return 0;
}
strcpy(studnt[i].name, str);
printf("enter the id studnt:\n");
scanf("%d", &studnt[i].id);
printf("enter your telephon number:\n");
scanf("%d", &studnt[i].number);
q = fopen(name_file, "a");
if (q == NULL)
{
printf("eror write\n");
return 0;
}
fprintf(q, "%d %s %d\n", studnt[i].id, studnt[i].name, studnt[i].number);
}
fclose(q);
print_studnt(q,name_file);
return 0;
}
【问题讨论】:
-
一个显而易见的问题需要解决:将
length+1 * sizeof(char)更改为(length+1) * sizeof(char)。请记住,乘法组比加法组更紧密。在这种情况下,sizeof(char)为 1 并不重要,但只要你在使用它,就可以正确使用它。 -
您多次打开该文件。在循环外打开一次。然后写入它并在完成写入后关闭文件。你所做的调用了实现定义的行为,你又使用了
while (!feof(q))..wrong。您的代码有很多需要纠正的地方——一本书的帮助不仅仅是答案。 -
@coderredoc 谢谢,在我从循环中打开文件后,它解决了。
-
@aviv.L.: stackoverflow.com/questions/562303/…