#c #file #scanf #fopen #dev-c
#c #файл #scanf #fopen #dev-c
Вопрос:
Я пытаюсь прочитать текстовый файл с целыми числами в нем и сохранить его в структурном массиве. Я могу прочитать первый файл, содержащий дополнительные данные символа, следующим образом с помощью этого кода:
fp = fopen("test.txt", "r");
while(fscanf(fp, "%s %d %d %d %d", a[i].letter , amp;a[i].hor, amp;a[i].width , amp;a[i].ver, amp;a[i].height)==5 amp;amp; i<LineCount){
if(ferror(fp) || feof(fp)) break;
i ;
}
- A 10 213 20 20
- B 100 10 150 15
- ….
Однако после этого, когда я пытаюсь прочитать другой файл, который имеет следующий формат, с этим кодом:
file1 = fopen("beg.txt", "r");
printf("HELLOOOO");
while(fscanf(file1, "%d %d %d %d", amp;b[i].id, amp;b[i].hor, amp;b[i].ver, amp;b[i].time)==4 amp;amp; i<LineCount){
printf("HEYY");
if(ferror(file1) || feof(file1)) break;
i ;
}
Формат :
- 1 10 100 100
- 2 100 10 100
- 3 172 172 18
- ….
fopen не возвращает NULL, поэтому он открывается, я вижу «HELLOOOO», но он никогда не доходит до «ПРИВЕТ», и программа завершается, не сразу, а за короткое время. Я дважды проверил все, файл и структура в правильном формате, я выполняю точно такую же операцию с первым, но она не работает.
Если у вас есть какие-либо идеи, что я делаю неправильно или какие могут быть возможные проблемы, я был бы признателен за ваши комментарии.
Комментарии:
1. Какое значение
i
перед чтением второго файла? Честно говоря, из того, что я прочитал, вы еще не все перепробовали. Например, вашfscanf()
сбой или нет? Пожалуйста, потратьте немного больше времени, это очень простая программа, которую вы должны иметь возможность отлаживать с помощью нескольких операторов печати или в отладчике.2. Спасибо за ваш комментарий.
i
равно 0. Я действительно пробовал печатать на каждом шаге, и мне не удалось обнаружить источник проблемы. Я только что кое-что понял. Я могу прочитать второй файл, если я не читаю первый. Кроме того, если я объявлю еще одну переменную в main и присвою ей значение перед чтением. Я не могу даже прочитать один файл. Поэтому, если я объявляю больше переменных, чем текущие, я не могу прочитать файл или, если я читаю файл, я не могу прочитать другой. Я не настолько разбираюсь в C, поэтому у меня нет знаний об этом материале. Это проблема, связанная с памятью, или проблема с оборудованием?3. Может
i>=LineCount
быть?4. Пожалуйста, создайте самую маленькую полную программу, в которой все еще есть эта проблема, и опубликуйте ее вместе с первыми несколькими строками ваших файлов. На данный момент вы показываете только несколько фрагментов, так что это догадки, что может быть не так. Почему вы думаете о проблеме с оборудованием или памятью для такой программы; вы запускаете это на глючной плате микроконтроллера с очень ограниченной памятью?
5. Хорошо, я перепостирую вопрос таким образом. Я думаю, что, поскольку я читаю файл в функции, и он работает, я объявляю любую переменную в main() перед этой функцией, и она перестает работать. Любая переменная, такая как
int u = 0
Ответ №1:
Здесь я создал другую программу с нуля и выполнил все операции в main. Все та же проблема. Первый файл считывается, сохраняется в структуре и печатается без проблем. Однако для второго файла даже функция fopen() на этот раз не работает, она также не возвращает никакого значения, null или -1. Он просто ждет и завершает программу.
Структуры:
struct data{
char name[2];
int a,b,c,d;
};
struct fix{
int x,y,z,u;
};
Чтение первого файла:
char c;
int lineCount = 1;
fp = fopen("data.txt", "r");
for (c = getc(fp); c != EOF; c = getc(fp)){ //Get the number of lines
if (c == 'n'){
lineCount = LineCount 1;
}
}
fclose(fp);
int i=0;
struct data* a;
a = (struct data*)malloc(sizeof(a)*lineCount); //Allocate memory for a
fp = fopen("data.txt", "r");
if(fp==NULL) printf("Nulln");
while(fscanf(fp, "%s %d %d %d %d", a[i].name , amp;a[i].a, amp;a[i].b , amp;a[i].c, amp;a[i].d)==5 amp;amp; i<lineCount){
if(ferror(fp) || feof(fp)) break;
i ;
fclose(fp);
for(i=0;i<lineCount;i ){
printf("%s, ", a[i].name);
printf("%d, ", a[i].a);
printf("%d, ", a[i].b);
printf("%d, ", a[i].c);
printf("%dn", a[i].d);
}
Чтение второго файла:
lineCount = 1;
//files=fopen("beg.txt","r");
if(files=fopen("beg.txt","r")==NULL) printf("Hey"); //STUCK HERE!
if(files==NULL) printf("NULL2");
for (c = getc(files); c != EOF; c = getc(files)){ //Get the number of lines
if (c == 'n'){ //Get t
lineCount = lineCount 1;
}
}
struct fix* b = (struct fix*)malloc(sizeof(b)*lineCount); //Allocate memory for b
files = fopen("beg.txt", "r");
while(fscanf(files, "%d %d %d %d", amp;b[i].x, amp;b[i].y , amp;b[i].z, amp;b[i].u)==4 amp;amp; i<lineCount){
if(ferror(fp) || feof(fp)) break;
i ;
}
Комментарии:
1. Учитывая
char c;
,c != EOF
не будет работать, потомуEOF
что это anint
, а не achar
.c != EOF
либо не сможет определить конец файла, либо преждевременно обнаружит конец файла, когдаchar
значение, считанное из файла, повышается доint
и соответствует фактическим битамEOF
целочисленного значения.getc()
возвращаетint
и неchar
по этой причине.2. Я понимаю. Но он работал правильно для первого файла, и это часто используемая практика, я не прав? Как вы думаете, это может вызвать проблему, с которой я сталкиваюсь? Как еще я мог подсчитать количество строк?