我正在尝试使用fscanf读取使用2个冒号作为分隔符的文件。例如:
输入
:西瓜::一种美味的水果::土豆::一种蔬菜::
每个产品和定义都用冒号分隔。我正在尝试遍历此列表,以便打印出定义和输出。
输出:(通过printf)
西瓜
一个美味的水果马铃薯
蔬菜
我不知道如何通过while循环进行迭代,而现在只是一遍又一遍地打印西瓜。
感谢您的帮助!
答案 0 :(得分:2)
使用strtok()是关键:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
FILE * fl;
long fl_size;
char * buffer;
size_t res;
fl = fopen ( "fruits.txt" , "r+" );
if (fl==NULL) {
fprintf (stderr, "File error\n");
exit (1);
}
fseek (fl , 0 , SEEK_END);
fl_size = ftell (fl);
rewind (fl);
buffer = (char*) malloc (sizeof(char)*fl_size);
if (buffer == NULL) {
fputs ("Memory error",stderr);
exit (2);
}
res = fread (buffer,1,fl_size,fl);
if (res != fl_size) {
fputs ("Reading error",stderr);
exit (3);
}
/*
* THIS IS THE PART THAT IS IMPORTANT FOR THE QUESTION!!
*/
char * strtok_res;
strtok_res = strtok(buffer, "::");
while (strtok_res != NULL)
{
printf ("%s\n", strtok_res);
strtok_res = strtok (NULL, "::");
}
/*
* DONE!
*/
fclose (fl);
free (buffer);
return 0;
}
答案 1 :(得分:1)
如果您可以确定该文件格式为
:<produce>::<description>::<produce>::<description>:...
然后你可以使用这种fscanf格式的循环:
char produce[100], description[100];
if ((fscanf(file, ":%99[^:]::%99[^:]:", produce, description) != 2)
{
/* Handle read error or EOF */
}