![](/img/trans.png)
[英]What is more efficient, reading word by word from file or reading a line at a time and splitting the string using 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.