2015-05-04 5 views
0

У меня есть задание программирования, которое дает файл данных «candidatesdata.txt» Вы должны читать информацию и расшифровывать, что такое имя, пол, высота и вес. Единственная проблема заключается в том, что между каждой записью данных есть цитаты вокруг имени и запятых. Файл выглядит следующим образом:Игнорирование ненужных символов при чтении из файла в C

Name,Gender,Height,Weight 
"Tanner, Mark C.”,M,71.8,180.25 
"Jinglehiemmerschmitt, John J.”,M,70.75,185.3 
"Parker, Sarah J.",F,65.25,120.3 

..cont.

Как читать записи данных и игнорировать цитаты и запятые? Это то, что у меня есть до сих пор, оно удаляет некоторые запятые и цитаты, но также и в процессе удаления имен.

#include <stdio.h> 

struct candidateinfo 
{ 
    char name[50]; 
    char gender; 
    double height; 
    double weight; 
}candidate; 


    int main() 
{ 
    int count =0; 
    FILE *candidate_data; 


    // Open file 
    candidate_data = fopen("/Users/moisestrevino/Documents/CS 1324/Assignment #5/Assignment #5/candidatedata.txt","r"); 

    fscanf(candidate_data, "%*[^\n]"); 
    fgetc(candidate_data); 

    // Get rid of unecessary letters 

     while (count<40) 
     { 
      count++; 

     fscanf(candidate_data,"\"%[^\"],%c,%lf,%lf\n", candidate.name, &candidate.gender, &candidate.height, &candidate.weight); 

      printf("%s %c %lf %lf\n",candidate.name, candidate.gender, candidate.height, candidate.weight); 
     } 

    fclose(candidate_data); 
    return 0; 

} 

Выход:

 Tanner, Mark C. 0.000000 0.000000 
,M,71.8,180.25 
    0.000000 0.000000 
Jinglehiemmerschmitt, John J. 0.000000 0.000000 
,M,70.75,185.3 
    0.000000 0.000000 
Parker, Sarah J. 0.000000 0.000000 
,F,65.25,120.3 
    0.000000 0.000000 
Meeks, Kalvin R. 0.000000 0.000000 
,M,57.25,210.2 


cont... 
+0

вы ___must___ сначала прочитайте [это] (http://stackoverflow.com/q/5431941/2173917). –

+0

А также, пожалуйста, укажите свой код – Eregrith

+0

Должен ли я использовать EOF вместо этого? –

ответ

0

Ваш код содержит много проблем. Есть слишком много, чтобы упомянуть, так вот исправление:

Если файл содержит данные в виде:

Name,Gender,Height,Weight 

, а затем,

"Tanner, Mark C.",M,71.8,180.25 
"Jinglehiemmerschmitt, John J.",M,70.75,185.3 
"Parker, Sarah J.",F,65.25,120.3 

то ниже исправление будет работать ,

После fopen, вы можете использовать

fscanf(candidate_data, "%*[^\n]"); 
fgetc(candidate_data); 

Первые сканы линии и отбрасывает все до символа новой строки. Вторая строка использует символ новой строки. После этого используйте

fscanf(candidate_data, " \"%[^\"]\",%c,%lf,%lf", name, gender, height, weight); 

Предполагая, что вы уже объявили char массив значительных размеров с именем name, char имени gender и двух double s имен height и weight, здесь пробой выше fscanf:

  • (пробел) сканирует и отбрасывает все пробельные символы до первого символа без пробелов.
  • \" сканирует файл " и удаляет его.
  • %[^\"] сканирует все до " и сохраняет его в name.
  • \" сканирует файл " и удаляет его.
  • , сканирует и удаляет запятую.
  • %c сканирует персонажа и сохраняет его в gender.
  • , сканирует и удаляет запятую.
  • %lf сканирует double и сохраняет его в height.
  • , сканирует и удаляет запятую.
  • %lf сканирует double и сохраняет его в weight.

Теперь вы можете распечатать каждое значение. Читайте больше данных, поставив выше fscanf в цикле.

Но откуда вы узнали, когда данные закончились? Проверьте возвращаемое значение fscanf. fscanf возвращает количество элементов ввода, успешно сопоставленных и назначенных, которые могут быть меньше, чем предусмотрено, или даже нуля в случае неудачного раннего совпадения.

В вашем случае fscanf вернет 4, если все данные были успешно отсканированы. Так, только читать на данных до fscanf не возвращается 4.


Как было предложено @chux, Вы можете предотвратить переполнение буфера с помощью

fscanf(candidate_data, " \"%49[^\"]\",%c,%lf,%lf", name, gender, height, weight); 

49 говорит scanf сканировать максимум 49 символов для name (+1 для NUL-терминатора)

+0

'' \ "% [^ \"] ",% c,% lf,% lf" '->' "\"% [^ \ "] \",% c,% lf,% lf "' (добавьте косую черту) Дальнейшее предложение '' \ "% 49 [^ \"] \ ",% c,% lf,% lf" '(добавить пробелы, ширина) – chux

+0

@chux, Спасибо, пропустил косую черту. –

+0

Рекомендовать добавить комментарий @ Random832 о входном файле с использованием различной цитаты: «Tanner, Mark C.» '' '' vs. '' '. – chux

0

Если каждая строка содержит все поля, вы можете использовать str (r) chr + atof вместо, например

char line[100]; 
while(fgets(line,100,candidate_data)) 
{ 
    char *p = strrchr(line,','); 
    weight = atof(p+1); *p=0; 
    p = strrchr(line,','); 
    height = atof(p+1); 
    gender = *--p; 
    *strrchr(line,'"')=0; 
    strcpy(name, strchr(line,'"')+1); 
} 
Смежные вопросы