在C语言中逐行读取文件并将字符串拆分成标记

3

我正在逐行读取文件,并将字符串分成标记。

int main()
{
    FILE* fp;
    char  line[255];

    fp = fopen("file.txt" , "r");
    while (fgets(line, sizeof(line), fp) != NULL)
    {   
        char val1[16];
        char val2[9];

        strcpy(val1, strtok(line, ","));
        strcpy(val2, strtok(NULL, ","));

        printf("%s|%s\n", val1, val2);          
    }
}

我的输入文件内容 (file.txt)

182930101222, KLA1512
182930101223, KLA1513
182930101224, KLA1514
182930101225, KLA1515

当我打印获取时
 | KLA1512

与其

182930101222| KLA1512

什么是问题?

调试你的代码,在strcpy调用之前打印“line”,以了解为什么“val1”是“\0”。 - Grijesh Chauhan
1
但是他的字符串末尾没有"\n"(或者甚至是"\r\n")。 - wildplasser
在之前的帖子中,你通过将7更改为9使其正常工作,现在请将9更改为10 :D - P0W
或者“为了安全起见”,将它们都更改为255。 - wildplasser
1
实际上,你的代码对我来说是有效的。 - Nemanja Boric
显示剩余5条评论
2个回答

6
你的问题(再一次)是你没有为数组分配足够的空间,从而覆盖了它的末尾。讽刺的是,在这种情况下,你甚至不需要分配任何(额外的)数组。`strtok()`正在对`line[]`数组进行标记化,用`'\0'`字符覆盖分隔符,并且这些就足够满足你的需求。
int main()
{
    FILE* fp;
    char  line[255];

    fp = fopen("file.txt" , "r");
    while (fgets(line, sizeof(line), fp) != NULL)
    {
        const char* val1 = strtok(line, ",");
        const char* val2 = strtok(NULL, ",");

        printf("%s|%s\n", val1, val2);
    }
}

请问您如何在C语言中删除字符数组中的换行符和空白符? - user2684719
@user2684719 - 从可修改的char缓冲区中删除_前导_和_尾随_空格并不困难。我可以编写函数并为您发布,但那有什么帮助你学习的呢? 您的line[255]缓冲区可以按您希望的任何方式进行修改。 您已经通过在其上调用strtok()(使用nul字符('\0')覆盖逗号分隔符),将其修改(将缓冲区转换为单独的C样式字符串,并通过指针val1val2跟踪) 。现在,只需编写自己的新函数以删除前导和尾随空格... - phonetagger
一个合适的函数签名应该是:char* remove_whitespace(char* str)。有了这个函数签名,你可以传入一个C风格的字符串指针,函数会根据需要修改字符串,并返回一个指向已删除空格的同一字符串的指针。如果没有前导空格,它将只返回传递给它的相同指针地址。在函数中,你从开头循环直到第一个非空格字符(参见 isspace())。当你找到它时,那就是字符串的新起点(你需要在指针中跟踪它,因为那是要返回的指针)。 - phonetagger
然后继续循环直到找到字符串的结尾(即遇到终止符'\0'字符为止)。然后向后扫描,直到找到第一个非空格字符,或者找到起始指针地址(无论哪种情况)。当你找到它时,只需将'\0'写入比它大一的地址,这将在该点终止字符串(截断任何空格,包括任何换行符)。 - phonetagger
@user2684719 - 顺便说一句,如果您在这个页面上找到了有用的答案,请将其选择为“最佳”答案。这是您“支付”帮助您的人的方式。此外,即使您没有选择它们作为“最佳”答案,也可以选择性地点赞任何有帮助的答案。 - phonetagger

0

fgets 函数会插入一个换行符。

只需将 val2 的大小增加 1,例如 val2[10]

或者移除末尾的 '\n'

while( fgets(line, sizeof(line), fp) != NULL ){ 
        char val1[16] ,val2[9];
        char *pos;
        if ((pos=strchr(line, '\n')) != NULL)
            *pos = '\0';
        strcpy(val1 , strtok(line,","));
        strcpy(val2 , strtok(NULL,","));
        printf("%s|%s\n",val1, val2);           
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接