Распарсить текстовый файл - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый вечер! Подскажите пожалуйста. Я новичок в языке С, как мне отформатировать файл вот такого вида:
Bly-bly vly uuu kjskdkn dslkmdlksd 122 dwnlld .2.2..2.
wkddw
dwmsmkmdlsmlkdmslkmdn  nsnd  wd n
String1K1 String1k2 String1k3
String2k1 String2k2 String2k3
String3k1 String3k2 String3k3
Нужно, что бы в массив можно было загнать только эти данные:
String1K1 String1k2 String1k3
String2k1 String2k2 String2k3
String3k1 String3k2 String3k3
Ну или вывести на экран, просто не могу сообразить, как его заставить соблюдать строчный порядок? Есть функция переноса строки? За ранние спасибо!

Решение задачи: «Распарсить текстовый файл»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_B 256
 
struct qwe{
char k1[128];
char k2[128];
}qw[MAX_B];
 
int main(void)
{
FILE *fl;
char *buff;
puts("Welcome My Soft!!!");
if((fl=fopen("./test.txt","r"))==NULL)
exit(1);
int y=0;
int b;
 
while(!feof(fl))
{
buff=malloc(MAX_B * sizeof(char));
fgets(buff,MAX_B,fl);
int z;
int r=0;
b=1;
for(z=0;z<MAX_B;z++)
{
 
if((buff[z] == ' ' || buff[z] == '\n') && (b == 2))
{
break;
}
if((buff[z] != ' ' || buff[z] != '\n') && (b == 2))
{
qw[y].k2[r]=buff[z];
r++;
continue;
}
//
if((buff[z] == ' ' || buff[z] == '\n') && (b == 1))
{
b=2;
r=0;
continue;
}
if((buff[z] != ' ' || buff[z] != '\n') && (b == 1))
{
qw[y].k1[r]=buff[z];
r++;
}
//
}
y++;
free(buff);
 
}
fclose(fl);
int u;
for(u=0;u<y;u++)
printf("%s * %s \n",qw[u].k1,qw[u].k2);
 
puts("The END!!!");
return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы:
    • stdio.h для работы с вводом/выводом
    • stdlib.h для работы с функциями общего назначения
    • string.h для работы со строками
  2. Определяем константу:
    • #define MAX_B 256 - максимальное количество элементов в массиве
  3. Определяем структуру данных:
    • struct qwe{ char k1[128]; char k2[128]; }qw[MAX_B]; - структура данных с двумя полями: k1 и k2, каждое из которых является массивом символов на 128 элементов
  4. В функции main() открываем файл:
    • if((fl=fopen(./test.txt,r))==NULL) exit(1); - если файл не может быть открыт, программа завершается
  5. Создаем переменные:
    • int y=0; - счетчик для подсчета количества заполненных элементов массива
    • int b=1; - флаг, определяющий текущий режим заполнения полей k1 и k2
    • int r=0; - счетчик для подсчета количества символов в текущем поле (k1 или k2)
  6. Запускаем цикл while:
    • while(!feof(fl)) - цикл выполняется до тех пор, пока не достигнут конец файла
  7. Выделяем память под буфер:
    • buff=malloc(MAX_B * sizeof(char)); - выделение памяти под буфер, размер которого равен MAX_B символам
  8. Заполняем буфер:
    • fgets(buff,MAX_B,fl); - чтение строки из файла в буфер
  9. Запускаем внутренний цикл for:
    • for(z=0;z<MAX_B;z++) - цикл выполняется для каждого символа в буфере
  10. Определяем условия для заполнения полей k1 и k2:
    • if((buff[z] == ' ' || buff[z] == '\n') && (b == 2)) - если текущий символ является пробелом или символом новой строки и флаг b равен 2, то прерываем внутренний цикл
    • if((buff[z] != ' ' || buff[z] != '\n') && (b == 2)) - если текущий символ не является пробелом или символом новой строки и флаг b равен 2, то записываем его в поле k2
    • if((buff[z] == ' ' || buff[z] == '\n') && (b == 1)) - если текущий символ является пробелом или символом новой строки и флаг b равен 1, то меняем значение флага b на 2
    • if((buff[z] != ' ' || buff[z] == '\n') && (b == 1)) - если текущий символ не является пробелом или символом новой строки и флаг b равен 1, то записываем его в поле k1
  11. Увеличиваем счетчики:
    • y++; - увеличение счетчика y на 1
    • r++; - увеличение счетчика r на 1
  12. Свободим память под буфер:
    • free(buff); - освобождение памяти под буфер
  13. Закрываем файл:
    • fclose(fl); - закрытие файла
  14. Запускаем цикл for для вывода заполненных данных:
    • for(u=0;u<y;u++) printf(%s * %s \n,qw[u].k1,qw[u].k2); - цикл выполняется для каждого заполненного элемента массива qw, выводя его поля k1 и k2
  15. Выводим сообщение об окончании работы программы:
    • puts(The END!!!); - вывод сообщения The END!!!
  16. Завершаем функцию main():
    • return 0; - возврат 0, что означает успешное завершение программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы