逐行读取文件并将字符串拆分为c中的标记

时间:2013-08-24 17:36:04

标签: c file

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

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

问题是什么?

2 个答案:

答案 0 :(得分:5)

你的问题(再次)是你没有为数组分配足够的空间,并覆盖它的结尾。具有讽刺意味的是,在这种情况下,您甚至不需要分配任何(附加)数组。 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);
    }
}

答案 1 :(得分: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);           
}