2016-05-01 5 views
1

У меня есть функция, которая читает в файле, который выглядит следующим образом в структуре. Я пытаюсь убедиться, что структура заполняется должным образом; и он заполняется правильно для Пол, Высота и Вес. Однако у меня возникли проблемы с проверкой правильности заполнения имени (массива символов).Проблема с чтением строки с запятой в

Пример файла для чтения в:

Name,Gender,Height,Weight 
Tanner,M,71.8,180.25 
John,M,70.75,185.3 
Parker,F,65.25,120.3 
Meeks,M,57.25,210.2 
Big,M,57.5,150.1 
Jackson,F,52.1,163.4 

STRUCT Определение:

struct canData 
{ 
    char name[50]; 
    char gender; 
    float height; 
    float weight; 
}CD[structSize]; // end struct BP 

часть петли, которая считывает файл:

char name[50]; 
    char gender; 
    float height; 
    float weight; 
    int position = 0; 

filePtr = fopen(fileName, "r"); // open file 
    if (filePtr == NULL) // error check opening file 
    { 
     printf("Opening file failed. Please reenter filename."); 
     exit(1); // WILL THIS RETURN TO MENU? 
    } // end if 

// skip header line of file 
    char buffer[100]; 
    fgets(buffer, 100, filePtr); 

while (fscanf(filePtr, "%[^,], %[^,], %f, %f", &name, &gender, &height, &weight) == 4) // read in 
    { 
     printf("%s\n", name); // DEBUG ATTEMPT 
     printf("%s\n", CD[position].name); // DEBUG ATTEMPT 
     printf("%f\n", weight); // DEBUG ATTEMPT 

     strcpy(CD[position].name, name); 
     CD[position].gender = gender; 
     CD[position].height = height; 
     CD[position].weight = weight; 
     position++; 
     iCount++; 



    } // end while 

В настоящее время мой выход в следует:

(space where name should be) 
(space where CD[position].name should be) 
180.25 
(space where name should be) 
(space where CD[position].name should be) 
185.3 
(space where name should be) 
(space where CD[position].name should be) 
120.3 
(space where name should be) 
(space where CD[position].name should be) 
... 

Спасибо за понимание! Я начинающий C, поэтому я могу пропустить что-то глупое.

+1

Какие типы 'name',' gender', '' height' и weight'? Вы уверены, что не вызываете * неопределенное поведение *, передавая указатели на объект с неправильным типом? – MikeCAT

+1

Вы уверены, что 'CD [position] .name' в DEBUG ATTEMPT инициализирован? Пожалуйста, напишите [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). – MikeCAT

+3

Вы печатаете 'CD [position] .name' _before_' strcpy'. Кроме того, попробуйте 'while (fscanf (filePtr,"% [^,],% [^,],% f,% f ", имя, пол, высота и вес) == 4)' –

ответ

1

scanf ожидает указатель на начальный байт массива, когда вы читаете строку. Так что не используйте &, когда вы проходите в качестве аргумента. fscanf(fp, "%[^,]", name) должен работать.

name будет преобразован в указатель при использовании в выражении.

http://pubs.opengroup.org/onlinepubs/009695399/functions/fscanf.html

+2

«' 'сам' 'является указателем в вашем коде." Нет, 'name' не является указателем, а массивом. Массивы, используемые в выражениях, по порядку преобразуются в указатель на его первый элемент. Обычно используемые исключения являются операндом оператора 'sizeof' и унарного оператора' & '. – MikeCAT

+0

Спасибо @MikeCAT – raiyan