Как читать разные записи данных, разделенные точкой с запятой, в массив в C?
из текстового файла: текст 1; 12.25; Текст Два; 5; Текст Три; 1,253
fopen ...
for(i = 0; i < nrRecords; i++) {
fscanf(myFile, " %[^;];", myRecords[i].firstText); /* Ok first text*/
fscanf(myFile, "%lf", &myRecords[i].myDouble1); /* But goes wrong with first double */
fscanf(myFile, " %[^;];", myRecords[i].secondText);
fscanf(myFile, "%d", &myRecords[i].myInt1);
fscanf(myFile, " %[^;];", myRecords[i].thirdText);
fscanf(myFile, "%lf",&myRecords[i].myDouble2);
}
fclose...
Ответ 1 · рейтинг 1 · Peter Cordes
Обычный совет - читать целые строки, а затем анализировать их с помощью sscanf, strtok или чего-то еще. Слишком легко потерять свое место во входном файле, если вы сканируете прямо из файла. (т. е. в первый раз, когда что-то не совпадает, вам нужен способ пропустить это, если вы не хотите просто прервать там.)
Ответ 2 · tomlogic
Я бы использовал fgets, чтобы прочитать строку из файла, strtok, чтобы разбить ее на точку с запятой, strcpy, чтобы скопировать строки, strtod, чтобы преобразовать в double и strtol, чтобы преобразовать в long (а затем преобразовать в целое число).
Или прочитайте строку и используйте конечный автомат для обхода каждого символа и выполнения правильной операции. Например, вы будете копировать каждый символ в firstText, пока не дойдете до точки с запятой, а затем использовать strtod, чтобы съесть двойную, пропустить точку с запятой, скопировать байты в secondText и т. д.
Или используйте одну строку формата scanf, чтобы разбить строку на все поля.
fscanf(myFile, " %[^;];%lf;%[^;];%d;%[^;];%lf",
myRecords[i].firstText,
&myRecords[i].myDouble1,
myRecords[i].secondText,
&myRecords[i].myInt1,
myRecords[i].thirdText,
&myRecords[i].myDouble2);
И, как упоминалось другими, проверьте возвращаемое значение fscanf.
Я предпочитаю читать строку за раз, чтобы одна плохая строка не испортила все последующие конверсии.