2013-07-02 3 views
-4

Текстовый файл, который я загружаю, находится в комментариях к приведенному ниже коду. Я не могу получить sscanf(), чтобы работать, как я думаю. Там должен быть путь, который почти этот элегантный без того, чтобы пройти через каждый символ с помощью указателей, для петель и т.д.Разбор строк с разделителями строк в C

//Apex City Hotel|4|61 Grassmarket|Edinburgh|EH1 
//Hilton Edinburgh Airport|4|Edinburgh International Airport|Edinburgh|EH12 
//Novotel Edinburgh Centre|4|80 Lauriston Place|Edinburgh|EH3 
//Premier Inn Haymarket|3|1 Morrison Link|Edinburgh|EH3 
//Premier Inn Lauriston Place|3|82 Lauriston Place|Edinburgh|EH3 
//Premier Inn Leith|3|51-53 Newhaven Place - Leith|Edinburgh|EH6 
//Sheraton Grand Hotel & Spa|5|1 Festival Square|Edinburgh|EH3 
//The Caledonian|5|Princess Street|Edinburgh|EH1 
//The Glasshouse|5|2 Greenside Place|Edinburgh|EH1 
//The Hilton Edinburgh Grosvenor|4|Grosvenor Street|Haymarket|Edinburgh|EH12 

Код:

int main(void) 
{ 
    char inputArray[NUM_OF_CHARACTERS]; 
    FILE *fp = fopen("OpenChampionshipHotels.txt", "r"); 
    fgets(inputArray, NUM_OF_CHARACTERS, fp);  

    if (fp == NULL) 
    { 
     printf("Error Reading File\n"); 
     exit(1); 
    } 

    // copy lines from text file to array 
    char hotelName[lineCount][NUM_OF_CHARACTERS]; 
    char hotelRating[lineCount][NUM_OF_CHARACTERS]; 
    char hotelStreetAddress[lineCount][NUM_OF_CHARACTERS]; 
    char hotelCity[lineCount][NUM_OF_CHARACTERS]; 
    char hotelPostalCode[lineCount][NUM_OF_CHARACTERS]; 

    lineCount = 0; 
    while(fgets(inputArray, sizeof(inputArray), fp) != NULL) 
    { 
     sscanf(inputArray, "%[^|]|%[^|]|%[^|]|%[^|]|%s", 
       hotelName[lineCount], 
       hotelRating[lineCount], 
       hotelStreetAddress[lineCount], 
       hotelCity[lineCount], 
       hotelPostalCode[lineCount]); 

     printf("%s\n", hotelName[lineCount]); 
     printf("%s\n", hotelRating[lineCount]); 
     printf("%s\n", hotelStreetAddress[lineCount]); 
     printf("%s\n", hotelCity[lineCount]); 
     printf("%s\n", hotelPostalCode[lineCount]); 

     lineCount++; 
    } 
    fclose(fp); 

    return 0; 
} 
+3

* «Я не могу заставить sscanf() работать, как я думаю, это должно быть». * Как вы думаете, что он должен работать? Какие результаты вы получаете? Что вы пытались отладить или исправить проблему? (Запрос вопроса ** 101 **) – abelenky

+0

'' Ошибка чтения файла ''является каноническим примером бесполезного сообщения об ошибке. Включите имя файла и причину! 'man perror' –

+0

Обратите внимание, что вы должны проверить возвращаемое значение из' sscanf() ', чтобы убедиться, что строка была в правильном формате. Если вы когда-либо получили полный почтовый индекс (EH3 9JX), вам нужно будет исправить спецификацию '% s'. –

ответ

2

Использование sscanf() есть хорошо. Ваша проблема в том, что вы используете lineCount, чтобы объявить размер ваших массивов, который предположительно является глобальной переменной и, следовательно, нулевым в этой точке.

Определить постоянную NUM_OF_LINES и использовать его вместо:

char hotelName[NUM_OF_LINES][NUM_OF_CHARACTERS]; 
char hotelRating[NUM_OF_LINES][NUM_OF_CHARACTERS]; 
char hotelStreetAddress[NUM_OF_LINES][NUM_OF_CHARACTERS]; 
char hotelCity[NUM_OF_LINES][NUM_OF_CHARACTERS]; 
char hotelPostalCode[NUM_OF_LINES][NUM_OF_CHARACTERS]; 

(Вы должны также проверить, что sscanf() вернулся 5, чтобы поймать линии без правильного количества полей, а также добавить lineCount < NUM_OF_LINES условию while()).