c - 从文件中读取,atoi() 仅在第一个元素上返回零

标签 c file-io csv atoi

我不明白为什么 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)

我做错了什么?

最佳答案

我猜你的 CSV 文件是以 UTF-8 格式保存的,并且开头有一个 BOM ( byte order mark),这让 atoi 感到困惑。您可以通过在十六进制编辑器中查看文件或查看 word 的前几个字节来验证这一点。

UTF-8 的 BOM 是三个字节,值为 0xEF、0xBB、0xBF。

如果可能,将文件保存为 ASCII。如果不是,请添加代码以检测并跳过这些字节。

关于c - 从文件中读取,atoi() 仅在第一个元素上返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2594249/

相关文章:

c# - 如何使我的应用程序更快地复制文件

python - 解析 Pandas 中的大字符串值

csv - 将数据从 Cassandra 导出到 CSV 文件

c - 如何获取 Mac OS X 的 C 包中所有库的列表?

c - 具有整数溢出条件的整数的反转

c++ - 如何检查来自 recvfrom() 的消息大小?

c - 具有最小内存占用的程序(在 Linux 上)

Java IOException "Too many open files"错误

visual-studio-2010 - 使用 File* 对象时出现错误指针错误

javascript - 如何使用 d3.csv 区分第一行中的相同键