Чтение из файла и токенизация ввода C

У меня проблемы с фрагментом кода, над которым я работаю. Он включает в себя связанные списки и некоторые надоедливые указатели. Вот пример кода:

PersonType *person;
FILE *c;
c = fopen("file.csv", "r");
char in[100];
fgets(in, 80, c); //Edited

root->head->next = 0;
char *getNum = strtok(in, ";");
char *getName = strtok(NULL, ";");
char *getHome = strtok(NULL, ";");
strcpy(root->head->getNum, getNum);
strcpy(root->head->getName, getName);
strcpy(root->head->getHome, getHome);
person = root->head;
if(person != 0){
    while(person->next != 0){
        person=person->next;
    }
}
//DEGUG
printf("Successfully Made a Person NODE");

Код не читается из файла, и я совершенно не понимаю, почему. В отладчике/трассировщике XCODE он инициализирует все символы получения нулевым значением. Может кто-нибудь указать мне в правильном направлении?

Спасибо.

ПРИМЕР ФАЙЛА

P1;Elyza;45 Random RD
P2;Ian;78 Shark CL

person user2385509    schedule 15.05.2013    source источник
comment
всегда полезно проверить коды возврата   -  person AndersK    schedule 15.05.2013
comment
Действительно, невозможно сказать, был ли файл успешно открыт или нет. Убедитесь, что c != NULL, затем убедитесь, что результат fgets != NULL.   -  person Lundin    schedule 15.05.2013
comment
вы говорите, что у вас проблемы с указателями и прочим, в таком случае вам нужно показать, как объявляются и размещаются структуры, которые вы используете, иначе невозможно дать прямой ответ.   -  person AndersK    schedule 15.05.2013


Ответы (2)


c = fopen("file.csv", "r");
char in[100];
fgets(in, 80, cin);

вы, вероятно, имели в виду

c = fopen("file.csv", "r");
char in[100];
fgets(in, 80, c);  // <---

также убедитесь, что вы проверяете возвращаемое значение из fopen(), чтобы обработать случай, когда файл не найден.

person AndersK    schedule 15.05.2013
comment
Ой.. Cin IS должен быть 'c' до сих пор не могу понять.. Извините - person user2385509; 15.05.2013
comment
вы не показываете root и root->head, так что вам трудно с этим помочь. например Вы выделяете память для них? - person AndersK; 15.05.2013

fgets(in, 80, cin);

Вот вам и проблема.
Наверняка вы хотели прочитать из FILE* c:

fgets(in, 80, c);
person user123    schedule 15.05.2013
comment
В C нет ничего с именем cin. И если бы это был C++, компилятор пожаловался бы на неправильные типы, переданные в fgets. - person Lundin; 15.05.2013
comment
Если компилируется, то компилятор хреновый и его надо заменить на настоящий. cin имеет тип std::istream, а не FILE*. - person Lundin; 15.05.2013
comment
Тогда ладно. Я буду более тонким. - person user123; 15.05.2013