Ich bin ein erschwerendes Problem habe, die ich nicht verstehen kann,fscanf! = EOF Clang-Compiler, anomale Verhalten
void file_count(FILE* stream,int* const num)
{
int temp;
while((fscanf(stream,"%d",&temp))!=EOF)
{
(*num)++;
}
}
Mit diesem Stück Programm, las ich von einer Datei in ihn alle Zahlen unter , und wenn ich eine Zahl nehme, erhöht sich ein Zähler, so dass ich zählen kann, wie viele Elemente in der Datei enthalten sind.
In dieser Datei gibt es 6 Zahlen, aber wenn ich diesen Code laufen lässt, springt der Zähler auf 32777 ... Wenn ich es mit gcc kompiliere, gibt es kein Problem und der Zähler ist 6 wie erwartet. Ist das ein Klirren? Ist das ein Merkmal, das mir nicht bekannt ist?
Die Datei enthält:
22 30 30 21 25 29
Der gesamte Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char* string;
typedef struct student
{
int flag;
char name[25];
char surname[25];
char dorm[25];
int* grades;
}
Student;
void check_input(const int argc,const string* const argv);
void check_file(FILE* stream);
void file_count(FILE* stream,int* const num);
void update_student(const string* const infos,Student* const student,const int grades,FILE* stream);
void print_student(FILE* stream,Student const student,const int grades);
int main(int argc, string argv[])
{
check_input(argc,argv);
FILE* one,* two;
string info[]={"David","Malan","Mather"};
Student student;
int grades;
one=fopen(argv[1],"r");
check_file(one);
file_count(one,&grades);
update_student(info,&student,grades,one);
fclose(one);
two=fopen(argv[2],"w");
check_file(two);
print_student(two,student,grades);
fclose(two);
free(student.grades);
system("cat out");
return 0;
}
void check_input(const int argc,const string* const argv)
{
if(argc!=3)
{
printf("\x1B[31mError: %s takes two arguments!\x1B[0m\n",argv[0]);
exit(EXIT_FAILURE);
}
}
void check_file(FILE* stream)
{
if(stream==NULL)
{
printf("\x1B[31mError:invalid file.\x1B[0m\n");
exit(EXIT_FAILURE);
}
}
void file_count(FILE* stream,int* const num)
{
int temp;
printf("reading file...\n");
while((fscanf(stream,"%i",&temp))!=EOF)
{
(*num)++;
}
printf("\x1B[33mthe value read were %i\x1B[0m\n",*num);
}
void update_student(const string* const infos,Student* const student,const int grades,FILE* stream)
{
rewind(stream);
student->grades=malloc(grades*sizeof(int));
strcpy(student->name,infos[0]);
strcpy(student->surname,infos[1]);
strcpy(student->dorm,infos[2]);
student->flag=0;
for(int i=0;i<grades;i++)
{
fscanf(stream,"%i",&student->grades[i]);
}
}
void print_student(FILE* stream,Student const student,const int grades)
{
printf("Writing to file..\n");
fprintf(stream,"%i %s %s %s ",student.flag,student.name,student.surname,student.dorm);
for(int i=0;i<grades;i++)
{
fprintf(stream,"%i ",student.grades[i]);
}
printf("\x1B[32mFile successfully written..\x1B[0m\n");
}
Im Code, den Sie nicht angezeigt haben, kann eine beliebige Anzahl von Fehlern auftreten. Siehe [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve). – user3386109
Zeigen Sie mehr Code und vorzugsweise die Datei an, die Sie als Eingabe verwenden. – AnT
Wahrscheinlich trifft man etwas, das keine Ganzzahl ist (höchstwahrscheinlich das Ende der Zeile, in der Tat), so dass "fscanf" es nicht konsumiert, so dass man dort hängenbleibt. –