簡體   English   中英

逐行讀取文件並將字符串拆分為c中的標記

[英]Reading a file line by line and splitting the string into tokens in c

我正在逐行讀取文件並將字符串拆分為令牌。

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

有什么問題?

您的問題(再次)是您沒有為數組分配足夠的空間,而是覆蓋了數組的末尾。 具有諷刺意味的是,在這種情況下,您甚至不需要分配任何(其他)數組。 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);
    }
}

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);           
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM