使用fscanf读取分隔文件

时间:2010-10-01 04:21:34

标签: c

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

输入

  

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

每个产品和定义都用冒号分隔。我正在尝试遍历此列表,以便打印出定义和输出。

输出:(通过printf)

  

西瓜

     一个美味的水果

     

马铃薯

     

蔬菜

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

感谢您的帮助!

2 个答案:

答案 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 */
}