![](/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.