Читая из файла, atoi () возвращает ноль только на первом элементе - PullRequest
0 голосов
/ 07 апреля 2010

Я не понимаю, почему atoi() работает для каждой записи, кроме первой. У меня есть следующий код для анализа простого файла .csv:

void ioReadSampleDataUsers(SocialNetwork *social, char *file) {
    FILE *fp = fopen(file, "r");

    if(!fp) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    char line[BUFSIZ], *word, *buffer, name[30], address[35];
    int ssn = 0, arg;

    while(fgets(line, BUFSIZ, fp)) {
        line[strlen(line) - 2] = '\0';

        buffer = line;
        arg = 1;

        do {
            word = strsep(&buffer, ";");

            if(word) {
                switch(arg) {
                    case 1:
                        printf("[%s] - (%d)\n", word, atoi(word));
                        ssn = atoi(word);
                        break;
                    case 2:
                        strcpy(name, word);
                        break;
                    case 3:
                        strcpy(address, word);
                        break;
                }

                arg++;
            }
        } while(word);

        userInsert(social, name, address, ssn);
    }

    fclose(fp);
}

И пример файла .csv это:

900011000;Jon Yang;3761 N. 14th St
900011001;Eugene Huang;2243 W St.
900011002;Ruben Torres;5844 Linden Land
900011003;Christy Zhu;1825 Village Pl.
900011004;Elizabeth Johnson;7553 Harness Circle

Но это вывод:

[900011000] - (0)
[900011001] - (900011001)
[900011002] - (900011002)
[900011003] - (900011003)
[900011004] - (900011004)

Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 07 апреля 2010

Я предполагаю, что ваш CSV-файл был сохранен в формате UTF-8 и в начале имеет спецификацию ( метка порядка байтов ), что сбивает с толку atoi.Вы можете убедиться в этом, посмотрев файл в шестнадцатеричном редакторе или просмотрев первые несколько байтов word.

Спецификация для UTF-8 - это три байта со значениями 0xEF, 0xBB, 0xBF.

Если возможно, сохраните файл как ASCII.Если нет, добавьте код для обнаружения и пропустите эти байты.

2 голосов
/ 07 апреля 2010

Я предполагаю, что файл начинается с метки порядка байтов. atoi() видит его как нецифровое значение, поэтому возвращает 0.

if (line[0] == 0xEF && line[1] == 0xBB && line[2] == 0xBF) {
    /* byte order mark is present, so skip it somehow */
}
...