【发布时间】:2015-06-06 12:43:00
【问题描述】:
我有以下问题:我必须制作一个包含姓名、年龄和成绩的学生档案。它工作正常,但问题是在屏幕上打印所有内容时。假设我读了 3 个学生,当我输入“L”在屏幕上打印内容时效果很好。当我按“A”将另一个学生添加到文件中(追加)时,该学生将出现在我的文件中(所以我们总共有 4 个学生),但是当我按“L”再次打印时,它只打印 3在 4 名学生中,包括附加的一名,但删除了另一名。 'S' 代表写入文件。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
struct student{
char nume[20];
int varsta;
float medie;
};
void citire_date(struct student *studenti, FILE *f, int n){
int i;
for(i=0;i<n;i++){
printf("Introduceti datele studentului %d\n", i+1);
printf("Nume: "); fflush(stdin); gets((studenti+i)->nume);
printf("Varsta: "); scanf("%d", &((studenti+i)->varsta));
printf("Medie: "); scanf("%f", &((studenti+i)->medie));
fprintf(f, "Nume: %s\n", (studenti+i)->nume);
fprintf(f, "Varsta: %d\n", (studenti+i)->varsta);
fprintf(f, "Medie: %.2f\n", (studenti+i)->medie);
fprintf(f, "\n");
}
}
void afisare_date(struct student *studenti, int n){
int i;
char nume1;
int varsta1;
float medie1;
for(i=0;i<n;i++){
printf("Nume: %s\n", (studenti+i)->nume);
printf("Varsta: %d\n", (studenti+i)->varsta);
printf("Medie: %.2f\n", (studenti+i)->medie);
printf("\n");
}
}
void append(struct student *studenti, FILE *f){
int i;
for(i=0;i<1;i++){
printf("Nume: "); fflush(stdin); gets((studenti+i)->nume);
printf("Varsta: "); scanf("%d", &((studenti+i)->varsta));
printf("Medie: "); scanf("%f", &((studenti+i)->medie));
fprintf(f, "Nume: %s\n", (studenti+i)->nume);
fprintf(f, "Varsta: %d\n", (studenti+i)->varsta);
fprintf(f, "Medie: %.2f\n", (studenti+i)->medie);
fprintf(f, "\n");
}
}
int main()
{
FILE *f;
struct student studenti[20];
int n;
char optiune;
f=fopen("studenti.txt", "w");
if(f==NULL){
printf("Nu s-a putut deschide/crea fisierul pentru scriere.\n");
exit(1);
}
printf("\n");
do{
printf("S. Scriere fisier.\n");
printf("A. Adaugarea unui nou student in fisier.\n");
printf("L. Listarea datelor tuturor studentilor.\n");
printf("M. Modificarea datelor unui student.\n");
printf("C. Cautarea unui student dupa nume.\n");
printf("X. Terminarea programului.\n");
printf("Introduceti optiunea: "); fflush(stdin); optiune=toupper(getchar());
printf("\n");
switch(optiune){
case 'S':
printf("Introduceti numarul de studenti: "); scanf("%d", &n);
citire_date(studenti, f, n);
fclose(f);
printf("\n");
break;
case 'A':
f = fopen("studenti.txt", "a");
if(f==NULL ){
printf("Nu s-a putut deschide fisierul pentru adaugare.\n");
exit(2);
}
append(studenti, f);
fclose(f);
break;
case 'L':
afisare_date(studenti, n);
break;
case 'M':
break;
case 'C':
break;
case 'X':
break;
default:
printf("\nAti introdus o optiune eronata!\n");
break;
}
}while(optiune!='X');
return 0;
}
我想我需要使用 fscanf,但我不知道它会如何从文件中读取 "Nume: name" "Varsta: 19" 等等。 提前谢谢你。
【问题讨论】:
-
您是否尝试在调试器中运行代码?
-
fflush(stdin);是未定义的行为。总是。另外,不要使用gets,由于非常不安全,它不再是 C 标准的一部分。请改用fgets。 -
f = fopen("studenti.txt", "a");但该文件之前已使用f打开。不要这样做:使用fseek()在列出之前和追加之前定位文件指针。 -
如果我不使用 'fflush(stdin):' 它会在不让我输入名称的情况下从 'Nume' 跳转到 'Varsta'。
-
case 'S'那是我关闭文件的地方。