Чтение файла с разделителями с помощью fscanf - PullRequest
0 голосов
/ 01 октября 2010

Я пытаюсь прочитать файл, который использует 2 двоеточия в качестве разделителя, используя fscanf. Пример:

Введите

: арбуз :: вкусный фрукт :: картофель :: овощ ::

Каждый из продуктов и определений разделен двоеточием. Я пытаюсь перебрать этот список, чтобы можно было распечатать определения и вывод.

Вывод: (через printf)

арбуз

вкусный фрукт

картофель

овощ

Я не уверен, как выполнять итерации через цикл while, а сейчас он просто печатает арбуз снова и снова.

Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 01 октября 2010

Использование 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 голос
/ 01 октября 2010

Если вы можете быть уверены, что файл отформатирован как

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

, тогда вы можете использовать цикл с таким форматом fscanf:

char produce[100], description[100];
if ((fscanf(file, ":%99[^:]::%99[^:]:", produce, description) != 2)
{
    /* Handle read error or EOF */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...