2012-11-18 3 views
1

Я хотел бы прочитать файл .csv по строкам, а затем проверить, соответствует ли первое слово моей строки string_1. Если это соответствует, то я также хотел бы проверить, соответствует ли второе слово string_2. Мой файл .csv содержит три поля: пользователь, пароль и тип. Вот мой код до сих пор:Анализ строк с использованием strtok в C

void verify (char *user, char *password) { 

    FILE *data; 
    char verifyUser[50]; 

    data = fopen("password.csv", "r+"); 
    while (fgets(verifyUser, 50, data) != NULL) { 

     char *ptr; 
     ptr = strtok(verifyUser, ", "); 

     /***What do I do here?***/ 
    } 

    fclose(data); 
} 

В этом случае user и password являются string_1 и string_2 соответственно. Какие-нибудь советы? Могу ли я использовать strtok, чтобы разделить мою линию на три подстроки, а затем выполнить strcmp? Если да, то как мне это сделать?

+0

первый совет: 'человек strtok' –

ответ

1

Как о чем-то вдоль этих линий:

ptr = strtok(verifyUser, ", "); 
if (!ptr || strcmp(ptr, user)) 
    continue; 

/* Okay, so the user matches. */ 
char *pass = strtok(NULL, ", "); 
if (!pass || strcmp(pass, password)) { 
    /* Invalid. */ 
    break; 
} 

Конечно, этот код предполагает, что вы уже доверяете строки user и password, и это также не тестировалась.

+0

Могу ли я спросить, что' pass'? – iHubble

+0

@iHubble Я отредактировал ответ. – cnicutar

+0

Большое вам спасибо! – iHubble

1

Я не хочу звучать педантично, но когда вы открываете файл, вы должны добавить if, чтобы проверить, может ли файл быть открыт или нет. Что-то вроде:

if ((data = fopen("password.csv", "r+")) != NULL){ 
    printf("The file couldn't be opened"); 
} 
else{ 
    . 
    . 
    . 
} 

Или, по крайней мере, что-то, чтобы заметить, если файл не может быть открыт для отслеживания проблемы.

+1

У меня на самом деле есть условие перед выполнением такой функции, которая проверяет, есть ли пароль.csv' можно открыть или нет, так что все в порядке. Но спасибо за совет! – iHubble

0

Первая вещь, которую вы не читаете его построчно Line..you копирования 50 символов в verifyUser
так AINT буду работать дольше, чем размер буфера (50) длины. fgets (verifyUser, 50, данные)

в Readline использовать что-то вроде этого ...

getline(data, yourVariable, '\n'); 

, а затем вы можете сделать, это ..

ptr = strtok(yourVariable, ", "); 
// now u have to iterate through `ptr` to get all the sub-strings(split-ed using parameter ',') 
while(ptr !=NULL){ 
    if(strcmp(ptr, user)){ 
     // do stuff here like `break;` etc 
    } 
} 

кстати это хорошая практика, если u сделать проверку ошибок ... как-то, если fopen() терпит неудачу (тогда вы не должны запускать остаток кода ..)

+0

wats неправильно с этим кодом или подход ..? –

+1

-1: fgets читает одну строку - размер '50' - это размер буфера (так что этот вызов не будет работать, если длина строки длиннее 48 символов, плюс конечная новая строка и NUL). Если вы хотите читать произвольно длинные строки, getline может быть лучшим выбором, но fgets не ошибается –

+0

Я согласен. Fget не ошибается ... но, как вы сказали, это не будет работать дольше, чем длина буфера. –

1

Самая большая проблема, с которой вы сталкиваетесь, заключается в том, что strtok(verifyUser, ", ") будет sp запустил строку ввода для обеих запятых AND SPACES, поэтому, если какое-либо из ваших полей содержит пробелы (например, настоящее имя), они будут разделены на несколько полей.

Обычный способ использования strtok в цикле:

for (token = strtok(inputLine, ","); token; token = strtok(0, ",")) { 
    /* do something with token */ 
Смежные вопросы