使用fscanf读取带分隔符的文件

使用fscanf读取带分隔符的文件,c,C,我正在尝试读取一个文件,该文件使用2个冒号作为使用fscanf的分隔符。例如: 输入 :西瓜::美味的水果::土豆::蔬菜:: 每个产品和定义都由冒号分隔。我试图遍历这个列表,以便打印出定义和输出 输出:(通过printf) 西瓜 美味的水果 马铃薯 蔬菜 我不知道如何通过while循环进行迭代,现在只是一遍又一遍地打印西瓜 谢谢你的帮助 使用strtok()是关键: #include <stdio.h> #include <stdlib.h> #include <

我正在尝试读取一个文件,该文件使用2个冒号作为使用fscanf的分隔符。例如:

输入

:西瓜::美味的水果::土豆::蔬菜::

每个产品和定义都由冒号分隔。我试图遍历这个列表,以便打印出定义和输出

输出:(通过printf)

西瓜

美味的水果

马铃薯

蔬菜

我不知道如何通过while循环进行迭代,现在只是一遍又一遍地打印西瓜

谢谢你的帮助

使用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;
}
#包括
#包括
#包括
int main(){
文件*fl;
长FLU尺寸;
字符*缓冲区;
大小;
fl=fopen(“fruits.txt”,“r+”);
如果(fl==NULL){
fprintf(stderr,“文件错误”\n);
出口(1);
}
fseek(fl,0,SEEK_END);
fl_尺寸=ftell(fl);
倒带(fl);
缓冲区=(char*)malloc(sizeof(char)*fl_size);
if(buffer==NULL){
fputs(“内存错误”,标准);
出口(2);
}
res=fread(缓冲区,1,fl_大小,fl);
如果(分辨率=fl\U尺寸){
fputs(“读取错误”,标准);
出口(3);
}
/*
*这是问题的重要部分!!
*/
char*strtok_res;
strtok_res=strtok(缓冲区“:”);
while(strtok_res!=NULL)
{
printf(“%s\n”,strtok_res);
strtok_res=strtok(NULL,“:”);
}
/*
*完成了!
*/
fclose(fl);
自由(缓冲);
返回0;
}

如果您可以确保文件的格式为

:<produce>::<description>::<produce>::<description>:...

给我们看看你的代码。
char produce[100], description[100];
if ((fscanf(file, ":%99[^:]::%99[^:]:", produce, description) != 2)
{
    /* Handle read error or EOF */
}