чтение текстового файла в структуру - PullRequest
1 голос
/ 16 мая 2011

мой текстовый файл такой (данные в файле тоже могут увеличиваться)

    822
    172.28.6.56
    172.34.34.53
    3244
    5434

    844
    192.150.160.145
    192.67.45.123
    2344
    234


    700
    192.13.56.6
    192.89.95.3
    4356
    3566

    522
    172.28.6.137
    172.28.6.110
    2543
    5245

    900
    255.255.255.255
    244.244.244.244
    2435
    3245

и моя структура такая

    struct input_par
    {
    int key_node;
    char src_ip[15];
    char dst_ip[15];
    int src_port;
    int dst_port;
    };

мне нужно заполнить это будущее изданные, хранящиеся в файле, после завершения ввода 5 элементов структуры, я должен отправить эту структуру в функцию, т.е. я заполняю структуру с помощью

    822
    172.28.6.56
    172.34.34.53
    3244
    5434

, затем я отправляю эту структуру функции, после того, какотправив его в функцию, я должен снова ввести структуру со следующими данными в файле, т.е.

    844
    192.150.160.145
    192.67.45.123
    2344
    234

Я должен продолжать делать это, пока не достигну EOF.Я использовал fscanf, он не работает должным образом, как это сделать?Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 05 марта 2014

Вы можете прочитать всю структуру за один вызов fscanf

--->

while(!feof(fp))
{
    input_par ip;
    int ret = fscanf(fp,"%*[ \t\n]%d%*[ \t\n]%s%*[ \t\n]%s%*[ \t\n]%d%*[ \t\n]%d",&ip.key_node,&ip.src_ip,&ip.dst_ip,&ip.src_port,&ip.dst_port);
    if (ret !=5)
    {
        //skip this record
        continue;
    }
    //process record ip
}
0 голосов
/ 16 мая 2011

Пока на самом деле есть только один пробел между каждой из этих структур ... Я мог бы сделать что-то вроде этого. Это довольно уродливо, но выполнит работу, если вы точно знаете свой максимальный размер строки и структура файла не будет иметь никаких ошибок (лишних пустых строк и т. Д.). В противном случае вам лучше будет написать гораздо лучший код, который обрабатывает и разбивает / возвращает в случае исключений.

Как отмечается в комментариях, вы должны убедиться, что в конце вашего массива char будет учитываться '\ n'. Вот некоторые модификации того, что я первоначально отправил. Обратите внимание, что это может нарушиться, если окончание строк основано на Windows (я полагаю). Я добавил небольшой хак, чтобы попытаться исправить проблему с массивом и символами \ n.

struct input_par
{
int key_node;
char src_ip[21];
char dst_ip[21];
int src_port;
int dst_port;
};


FILE* file = fopen("inputfile.txt", "r");
char linebuffer[21]; //a little extra room here than needed, presumably...
struct input_par ip;
int i = 0, l = 0;

while(fgets(linebuffer, 20, file))
{
   ip.key_node = atoi(linebuffer);
   fgets(linebuffer, 20, file);
   strcpy(ip.src_ip, linebuffer);

   l = strlen(linebuffer);
   for(i = 0; i < l; ++i){
      if(linebuffer[i] == '\n'){
         linebuffer[i] = '\0'
         break;
      }
   }

   fgets(linebuffer, 20, file);
   strcpy(ip.dest_ip, linebuffer);

   l = strlen(linebuffer);
   for(i = 0; i < l; ++i){
      if(linebuffer[i] == '\n'){
         linebuffer[i] = '\0'
         break;
      }
   }

   fgets(linebuffer, 20, file);
   ip.src_port = atoi(linebuffer);
   fgets(linebuffer, 20, file);
   ip.dst_port = atoi(linebuffer);
   fgets(linebuffer, 20, file); //get the empty line
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...