Чтение различных данных из текстового файла, разделенного точкой с запятой в C - PullRequest
0 голосов
/ 01 декабря 2009

Как читать разные записи данных, разделенных точкой с запятой, в массив в C?

из текстового файла: Text One; 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...

Ответы [ 3 ]

1 голос
/ 10 декабря 2009

Обычный совет - читать целые строки, а затем анализировать их с помощью sscanf, strtok или чего-то еще. Слишком легко потерять свое место во входном файле, если вы сканируете прямо из файла. (то есть в первый раз, когда что-то не совпадает, вам нужен способ пропустить это, если вы не хотите просто прервать его.)

0 голосов
/ 13 марта 2010

Я бы использовал 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.

Я предпочитаю читать строки за раз, чтобы избежать того, что одна плохая строка испортит все последующие преобразования.

0 голосов
/ 01 декабря 2009

Одним из способов является использование strtok . А затем введите результат в int или float.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...