Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
 Аватар для H1mera
2 / 2 / 1
Регистрация: 05.11.2016
Сообщений: 32

Парсинг строк из текстового файла

09.02.2019, 22:31. Показов 6287. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, господа!

Уже n-ое количество времени мучаюсь со следующей задачей:
Имеется программа, в которой по нажатию кнопки пользователь выбирает у себя на компьютере файл с определенными данными.
Данные представляют из себя список строк. Каждая строка содержит 4 числа, разделенные знаком табуляции "\t". Проблема заключается в том, что у меня не получается распарсить строку и записать каждое число в соответствующий ему массив для дальнейшей работы с этими числами.

Например, имеется файл "123.txt", в который записана строка следующего вида:

001043002 1104572 6513925 1

Мне удалось пока что написать такой "костыльный" код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  String filter = "Текстовый документ (.txt) |*.txt";
  opnDlg->Filter = filter;
  opnDlg->Execute();
  edtMultPath->Text = opnDlg->FileName;
 
  char buf[128];
  char c;
  String str = "";
 
  String Path = edtMultPath->Text;
  FILE *pFile = fopen(Path.c_str(), "r");
 
  if(!pFile) return;
 
  fseek(pFile , 0 , SEEK_SET);
 
  while(!feof(pFile))
  {
 
       while(static_cast<char>(fgetc(pFile))!= '\t') 
       {
 
          fseek(pFile, 1 ,SEEK_CUR);
          c = (char)(getc(pFile));
          str+=c;
       }
 
       Memo1->Lines->Add(str);
  }
 
  fclose(pFile);
Ну и, естественно, он не работает должным образом. После выполнения кода, в мемо выводится следующее:

132
13207635


Собственно вопрос: как исправить код так, чтобы он работал корректно?

PS: за код не ругайте, я только недавно начал изучать работу с файлами.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2019, 22:31
Ответы с готовыми решениями:

Парсинг большого текстового файла
Приветствую! Вопрос вот в чем - Как открыть файл и прочесть содержимое разделив его на итемы. Пример кода на питоне. file =...

Заполнить массив строк из текстового файла
Помогите из текстового файла заполнить массив 1.txt содержит в себе Маша Паша Саша Даша как этими словами заполнить...

Чтение и анализирование строк из текстового файла
Делаю программу, нужна помощь. Суть программы в том, что она в текстовом файле, где в строке написано Имя, Пол и Рост, искала Мужчину с...

15
Модератор
 Аватар для D1973
9911 / 6448 / 2455
Регистрация: 21.01.2014
Сообщений: 27,375
Записей в блоге: 3
10.02.2019, 07:42
Цитата Сообщение от H1mera Посмотреть сообщение
Собственно вопрос: как исправить код
Собственно, встречный вопрос: а какова итоговая цель всего этого мракобесия?
Вы создали тему в разделе C++Builder. Тогда почему Вы не работаете с текстовыми файлами так, как принято в Билдере? К чему эти замуты в стиле C++?
Цель задачи точно сформулируйте и версию Билдера укажите.
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
10.02.2019, 09:26
H1mera, А не проще ли
C++
1
2
 if(opnDlg->Execute()) 
  Memo1->Lines-LoadFromFile(opnDld->FileName);
0
 Аватар для H1mera
2 / 2 / 1
Регистрация: 05.11.2016
Сообщений: 32
10.02.2019, 11:28  [ТС]
D1973,
Во-первых, я не знаю как принято в билдере работать с файлами. Что нашел в интернете, то и использую (это вроде довольно распространенный метод).
Во-вторых, я уже расписал, что хочу сделать, но для вас повторюсь:

Есть текстовый файл, в который записано n-ое кол-во строк. Каждая строка содержит 4 числа произвольной длины. Мне необходимо разбить каждую строчку из файла на 4 части (то бишь 4 числа), минуя знаки разделения между числами - "\t".

Как еще более понятнее объяснить - я не знаю.

Версия: C++ Builder 6
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2019, 13:43
Цитата Сообщение от D1973 Посмотреть сообщение
Вы создали тему в разделе C++Builder. Тогда почему Вы не работаете с текстовыми файлами так, как принято в Билдере? К чему эти замуты в стиле C++?
Не в стиле С++ а в стиле Си.

Во во вторых в билдере нет нормальных средств работы с файлами.

Добавлено через 2 минуты
H1mera, Можно использовать fstream (и возможно sstream, getline)
1
 Аватар для H1mera
2 / 2 / 1
Регистрация: 05.11.2016
Сообщений: 32
10.02.2019, 13:47  [ТС]
Avazart, скажите, а как-то можно решить проблему, используя структуру FILE? Раз уж я полез в это болото, хотелось бы дойти уже до конца.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
10.02.2019, 14:35
Цитата Сообщение от H1mera Посмотреть сообщение
используя структуру FILE?
fscanf
1
 Аватар для H1mera
2 / 2 / 1
Регистрация: 05.11.2016
Сообщений: 32
10.02.2019, 14:53  [ТС]
nonedark2008,
Читал, что использовать fscanf крайне нежелательно.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2019, 15:00
Так Вы определитесь что надо... сами же сказали через FILE и сами сказали болото
0
 Аватар для H1mera
2 / 2 / 1
Регистрация: 05.11.2016
Сообщений: 32
10.02.2019, 15:07  [ТС]
Avazart, я образно сказал

А так, да, хочу сделать через FILE, если это реализуемо
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2019, 15:25
Цитата Сообщение от H1mera Посмотреть сообщение
если это реализуемо
Цитата Сообщение от nonedark2008 Посмотреть сообщение
fscanf
Ответ уже дан.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
10.02.2019, 16:06
Лучший ответ Сообщение было отмечено H1mera как решение

Решение

Цитата Сообщение от H1mera Посмотреть сообщение
использовать fscanf крайне нежелательно
Если проблема в безопасности, то есть fscanf_s. А о производительности пока думать рано.
1
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
10.02.2019, 17:53
Средствами билдера:
Выемка значений из численно-буквенной строки в TMemo
C++
1
2
3
4
5
6
7
8
9
10
11
12
  TStringList *list = new TStringList;
  TStringList *list2 = new TStringList;
//  list->Delimiter = '\t';
  list->LoadFromFile(ExtractFilePath(ParamStr(0)) + "123.txt");
  for (int i = 0; i < list->Count; i++)
  {
    list2->CommaText = list->Strings[i];
    for (int j = 0; j < 4; j++)
      ShowMessage(list2->Strings[j]);
  }
  delete list;
  delete list2;
1
Модератор
 Аватар для D1973
9911 / 6448 / 2455
Регистрация: 21.01.2014
Сообщений: 27,375
Записей в блоге: 3
10.02.2019, 17:57
Цитата Сообщение от Avazart Посмотреть сообщение
Во во вторых в билдере нет нормальных средств работы с файлами.
Целый модуль IOUtils, если использовать что-то менее древнее, чем Builder 6...
Цитата Сообщение от H1mera Посмотреть сообщение
Как еще более понятнее объяснить - я не знаю.
У Вас самоцель - разбить каждую строку на 4 части? А дальше что? Что с каждой из этих частей делать-то?
Вот пример, как разместить файл указанной структуры (4 столбца, неважно сколько строк) в двумерный целочисленный массив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <memory>
#include <vector>
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  std::auto_ptr<TStringList> L (new TStringList);
  L->LoadFromFile("c:\\tmp\\111.txt");
  int R = L->Count, C = 4;
  std::vector< std::vector<int> > Matrix(R, std::vector<int>(C));
  for(int i = 0; i < R; i++)
   {
     std::auto_ptr<TStringList> Tmp (new TStringList);
     Tmp->Delimiter = '\t';
     Tmp->DelimitedText = L->Strings[i];
     for(int j = 0; j < Tmp->Count; j++)
      Matrix[i][j] = StrToInt(Tmp->Strings[j]);
   }
}
Заполнить, к примеру, СтрингГрид - еще проще:
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   std::auto_ptr<TStringList> L (new TStringList);
   L->LoadFromFile("c:\\tmp\\111.txt");
   StringGrid1->RowCount = L->Count;
   for(int i = 0; i < L->Count; i++)
    {
      StringGrid1->Rows[i]->Delimiter = '\t';
      StringGrid1->Rows[i]->DelimitedText = L->Strings[i];
    }
}
Ну а что Вам там на самом деле надо, какова конечная цель чтения файла и разбиения каждой строки - это Вам лучше знать...
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2019, 18:46
Цитата Сообщение от D1973 Посмотреть сообщение
Целый модуль FileUtils, если использовать что-то менее древнее, чем Builder 6...
Довольно скудный и непонятный.
0
Модератор
 Аватар для D1973
9911 / 6448 / 2455
Регистрация: 21.01.2014
Сообщений: 27,375
Записей в блоге: 3
10.02.2019, 20:07
Цитата Сообщение от Avazart Посмотреть сообщение
Довольно скудный и непонятный
Лично для моих целей - вполне удобный и достаточный...
(и, да, описался изначально, не FileUtils, а IOUtils)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.02.2019, 20:07
Помогаю со студенческими работами здесь

Интерпретация строк текстового файла в числа и их модификация
в файле в ASCll лежат числа от 0-1030, по 1 числу в строке в каждой строке 4 символа, и он имеет такой вид 0001 0005 0009 0013 ...

Упорядочивание строк текстового файла
Помогите пожалуйста это реализовать, буду очень благодарен. Под заголовком окна горизонтально размещено: не редактируемый текст...

Парсинг строк из огромного текстового файла из конца в начало средствами VBA Excel быстро
Хочу поделиться опытом. Была поставлена задача с помощью VBA Excel читать строки из огромного (более 200Мб) текстового файла, причем из...

Парсинг текстового файла
Здравствуйте Мне нужно написать бат файл, который будет читать строку из текстового файла, заносить её в переменную и создавать папку с...

Парсинг текстового файла
В общем проблема такая. Имеется текстовый файл такого вида: Группа=Холодные напитки Пиво &quot;Сибирская корона&quot;=100 Пиво...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru