#c #file-handling
#c #обработка файлов
Вопрос:
#include <stdlib.h>
#include<string.h>
typedef struct monster {
int id;
char name[64];
char element[64];
int population;
double weight;
} monster;
typedef struct {
long long int compares;
long long int copies;
} sort_results;
int main(void) {
monster m[1000],n;
sort_results s;
FILE *file = NULL;
file = fopen("10.txt", "r");
if(file==NULL)
printf("not read");
int i=0;
while(!feof(file)) {
fscanf(file,"%s %s %d %lf", n.name,n.element,amp;n.population,amp;n.weight);
n.id = i 1;
/* this commented code gives error segmenatation fault*/
// strcpy(m[i].element,n.element);
// strcpy(m[i].name,n.name);
// m[i].population = n.population;
// m[i].weight = n.weight;
// m[i].id = n.id;
i ;
// this is working fine , printing expected result
printf("%s %s %d %lfn",n.name,n.element,n.population, n.weight);
}
printf(" n record count :%d",i);
}
File content
0ybOAtlTP KaRIvi05m 77 1.658986
Zr700nwzB BaFrl3BMN 85 3.019501
SJXVx8seR cMQZZBogi 179 0.237434
n5F30UhgA GPJucKtsW 243 1.082797
BnJBzm9dq NwZKlaEu3 179 5.048067
there is one new line gap in records
1 . это образец из 5 записей, но в файле может быть любое количество записей. Заявление Fscanf работает fine..it читает записи , как и ожидалось . Но существует более одной записи, поэтому я попытался сохранить их в массив, но это выдает ошибку как ошибку сегментирования для прокомментированной части кода.
2. Поскольку не существует какого-либо фиксированного количества записей для чтения, есть ли у них какой-либо способ добиться этого, поскольку каждый раз, когда он встречает новую запись в цикле while, должен быть создан новый блок памяти, некоторая концепция перераспределения и вызова в C. я пытался добиться этого, используя статическое распределение из массива, но мне это нужно как динамическое
Комментарии:
1. Сколько еще таких записей у вас есть в файле? это больше, чем
1000
?2. да, у меня есть 5 разных файлов для обработки, имеющих различную длину записи (1000,5000,10000). Но я попробовал этот код только для 5 записей. Все еще выдает ошибку
3.
while (!(feof(...))
всегда неверно, и вам нужно проверить возвращаемое значениеfscanf
! И если файл не был успешно открыт, вы все равно продолжаете чтение из него…4. Использование
%s
очень плохое, так как может переполнить буфер. Использоватьcs
5. @DeepakSharma я проверил в своей системе. Я не получил никакой ошибки сегментации. Он работает. Ваш код не включал файл заголовка «stdio.h».