Понедельник, 16 Сентября 2019, 13:22

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Парсинг строки
Парсинг строки
masb8ly-GCДата: Вторник, 17 Января 2012, 17:47 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Здравствйте! Возникла необходимость прочитать из файла текст, занести в массив и анализировать его. Прочитать из файла и занести в массив я смог (убил 3 дня (у меня появлялись буквы "я" в конце вывода по количеству строк минус одна) в итоге ничего не поменял, но буквы "я" перестали выводится на 3 день), а вот как анализировать нужным мне образом я не могу даже предположить.
Содержание файла приблизительно такое:
Quote
text:Проверка!
23:Да.
67:Нет.
56:Не знаю.

Требуется вывести так:

Как это сделать? Прошу помощи и надеюсь на понимние! Заранее спасибо!

Добавлено (17.01.2012, 17:47)
---------------------------------------------
23, 67, 56 тоже нужные данные, но я думаю, что их прочитать по аналогии будет не сложно)


Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders


Сообщение отредактировал masb8ly-GC - Вторник, 17 Января 2012, 17:24
CoyoteДата: Вторник, 17 Января 2012, 18:36 | Сообщение # 2
был не раз
Сейчас нет на сайте
Типа убрать английские слова и цифры с двуеточиями?
TimKruzДата: Вторник, 17 Января 2012, 19:12 | Сообщение # 3
старожил
Сейчас нет на сайте
masb8ly-GC, поищи в интернете "C++ работа со строками", найди какую-нибудь статейку по душе и сразу со всем разберёшься. Спрашивать на форуме простейшие методы работы со строками... Ну, просто это многократно описывалось в книгах, статьях, обсуждалось на форумах...
А когда разберёшься с функциями, можно уже подумать над разбором строки.
Но я советую тебе вместо массива читать и обрабатывать данные из файла сразу. Это проще.
А ещё проще, но менее рационально (с использованием строк разной длины, для памяти на диске) - использовать файлы записей (если такое есть в Си).


masb8ly-GCДата: Вторник, 17 Января 2012, 20:37 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Ну попробую поискать, просто ничего абсолютно похоже на мой вариант не нашел. Дело в том, что мне нужно вывести то, что после text наверх, потом разделительная полоса, а остальное это номера файлов из которых снова запрашивается информация и повторно совершатся операция, но уже с этим файлом при вводе номера строки.
На делфи я бы это сделал намного проще: прочитал каждую отдельную строку в стринг и потом через pos все занес куда надо, но так как я решил больше не прибегать к делфи, а двигатся вперед, то буду разбиратся)


Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders


Сообщение отредактировал masb8ly-GC - Вторник, 17 Января 2012, 20:45
TimKruzДата: Вторник, 17 Января 2012, 21:11 | Сообщение # 5
старожил
Сейчас нет на сайте
Quote (masb8ly-GC)
Дело в том, что мне нужно вывести то, что после text наверх, потом разделительная полоса, а остальное это номера файлов из которых снова запрашивается информация и повторно совершатся операция, но уже с этим файлом при вводе номера строки.

Если нет подходящих функций - обрабатывай по-символам. Скажем, ":" - разделитель параметров, перевод каретки - разделение строк, что-то типа "@" - разделение записей в одном файле (если записей больше одной).
Quote (masb8ly-GC)
а остальное это номера файлов из которых снова запрашивается информация и повторно совершатся операция, но уже с этим файлом при вводе номера строки.

А не проще всё в один файл писать? Что у тебя, текстовая игра/опросник?
Quote (masb8ly-GC)
На делфи я бы это сделал намного проще: прочитал каждую отдельную строку в стринг и потом через pos все занес куда надо, но так как я решил больше не прибегать к делфи, а двигатся вперед, то буду разбиратся)

Да ладно, Delphi на уровне с C++; любой проект можно сделать на обоих этих языках.

P.S. В C++ есть структурированный тип данных, что-то среднее между record и class в Delphi, попробуй считывать сразу целую структуру из файла.


masb8ly-GCДата: Вторник, 17 Января 2012, 21:24 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Quote (TimKruz)
А не проще всё в один файл писать? Что у тебя, текстовая игра/опросник?

Ну вроде того) Тренируюсь немного) Запись в один файл не хочется, поскольку файлов будет несколько сотен, а возможно и тысяч. И парсить 1 файл и потом просто перепрыгивать с одной точки на другую не позволят знания си)
Quote (TimKruz)
Да ладно, Delphi на уровне с C++; любой проект можно сделать на обоих этих языках.

Согласен! Но решил учить плюсы, поскольку делфи же довольно не плохо изучил, а останавливатся на достигнутом глупо.

Добавлено (17.01.2012, 21:24)
---------------------------------------------
И что за напасть?! Опять эти буквы я появились(
Хотя вчера не было((


Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders


Сообщение отредактировал masb8ly-GC - Вторник, 17 Января 2012, 21:20
mitchДата: Вторник, 17 Января 2012, 21:26 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
masb8ly-GC, на сколько я помню в с++ можно так же как и в дельфи построчно считывать и выводить, если подключить iostream и использовать функцию cin для ввода, cout для вывода данных
или тебе что-то другое надо?


Сообщение отредактировал mitch - Вторник, 17 Января 2012, 21:26
masb8ly-GCДата: Вторник, 17 Января 2012, 21:29 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Ну оно вводится из файла... Точнее читается.

Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
mitchДата: Вторник, 17 Января 2012, 21:42 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
masb8ly-GC, а надо-то что? скажи конкретно
если нужна pos из дельфи, то придется руками писать функцию скорее всего
masb8ly-GCДата: Вторник, 17 Января 2012, 21:48 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Нужно прочитать файл (уже сделал, только непонятно почему опять стали появлятся буквы "я" в выводе по количеству строк минус одна), проанализировать его таким образом:
1. Записать то, что до : в массив "а".
2. Записать то, что после : в массив "b".
3. Записать то, что после text: в переменную "c".
С выводом уже не сложно будет. Но вот это мне совершенно непонятно. Поискал статьи, почитал, ничего не нашел. Неужели я настолько туп sad


Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
SWFcreatorДата: Вторник, 17 Января 2012, 21:52 | Сообщение # 11
участник
Сейчас нет на сайте
Я бы сделал это так:
arr - твой массив, сначала инициализируешь его весь знаком '\0', потом считываешь в него файл, ну и вывод:
Code

for(bool write = false, short i = 0; arr[i] != '\0'; i++)
{
  if(write)
   std::cout << arr[i];
  if(arr[i] == ':')
   write = true;
  if(arr[i] == '\n')
   write = false;
}
masb8ly-GCДата: Вторник, 17 Января 2012, 22:06 | Сообщение # 12
постоянный участник
Сейчас нет на сайте
Похоже С не мое(
Ваш код у меня категорически отказался работать. Я решил попробовать сделать через strchr, получилось, но только после вывода есть такое:

Содержание файла такое:
Quote
4:Проверка!!!




Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders


Сообщение отредактировал masb8ly-GC - Вторник, 17 Января 2012, 22:08
TimKruzДата: Вторник, 17 Января 2012, 22:10 | Сообщение # 13
старожил
Сейчас нет на сайте
Quote (masb8ly-GC)
и потом просто перепрыгивать с одной точки на другую не позволят знания си)

Ну тут как в Delphi можно менять положение указателя и всё... А если сделать кучкой структур - будет проще... А вот тысяча файлов - ты их каждый раз собираешься открывать/закрывать? Время. Или хранить указатели? Память. А если не позволяют знания - изучай глубже. smile
Quote (masb8ly-GC)
И что за напасть?! Опять эти буквы я появились(
Хотя вчера не было((

Ну, как я понимаю, он просто читает лишний раз то, чего нет, и в итоге получает какой-то дефолтный символ, отображающийся как "я". Проверь, сколько раз читаешь из файла... Проверяй признак конца файла.
Quote (mitch)
iostream

Точно, слышал про такой. Input-output stream (поток входа-выхода); куча разных полезных функций и структур (классов/объектов) для работы с разными штуками типа файлов... Странно, почему он не подключается по-умолчанию.

***
Quote (masb8ly-GC)
но только после вывода есть такое:

В цикле что-то напутали.




Сообщение отредактировал TimKruz - Вторник, 17 Января 2012, 22:12
masb8ly-GCДата: Вторник, 17 Января 2012, 22:13 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
Ну на данный момент мой код выглядит так:
Code
#include <iostream>  
#include <conio.h>
using namespace std;  

int main( void )
{       
  setlocale( LC_ALL, "Russian" );
  FILE *f;
  char * pch;
  int i;
  f=fopen("G:\\TQS\\1.txt", "r");
  fseek(f,0,SEEK_END);  
  size_t L = ftell(f);  
  fseek(f,0,SEEK_SET);  
  char* c = new char[L];  
  for(i = 0; i<L; i++)  
  {  
   c[i] = fgetc(f);
//  cout << c[i];
  }
  pch=strchr(c,':');
  pch=pch+1;
  cout << pch;
  fclose(f);
  _getch();
  return 0;
}

Читать пустой символ ему не откуда, т.к читает ровно до конца файла, тем более они уже пропадали))
А вот откуда берутся символы после pch вообще не понятно(

Добавлено (17.01.2012, 22:13)
---------------------------------------------

Quote (TimKruz)
В цикле что-то напутали.

Дик тут цикла нету)


Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
TimKruzДата: Вторник, 17 Января 2012, 22:24 | Сообщение # 15
старожил
Сейчас нет на сайте
Quote (masb8ly-GC)
Дик тут цикла нету)

For же есть... С ним можно реально намудрить...


SWFcreatorДата: Вторник, 17 Января 2012, 22:27 | Сообщение # 16
участник
Сейчас нет на сайте
Вот мой полный код, считывает файл в массив, выводит на экран из массива все кроме символов до ":" и его самого.
Code

#include <iostream>
#include <fstream>

int main()
{
  setlocale(0, "Rus");
  char arr[100];
  for(short i = 0; i < 100; arr[i++] = '\0');
  std::ifstream file("text.txt");
  for(short i = 0; !file.eof() && i < 100; arr[i++] = file.get());
  bool write = false;
  for(short i = 0; arr[i++] != '\0';)
  {  
   if(write)  
    std::cout << arr[i];  
   if(arr[i] == ':')  
    write = true;  
   if(arr[i] == '\n')  
    write = false;  
  }  
  std::cin.get();
  return 0;
}
masb8ly-GCДата: Вторник, 17 Января 2012, 22:34 | Сообщение # 17
постоянный участник
Сейчас нет на сайте
БЛАГОДАРЮ! Огромное спасибо! Буду разбиратся в чем ошибки были на примере вашего кода! + тов. SWFcreator и тов. TimKruz обязательно! Спасибо за помощь!)

Добавлено (17.01.2012, 22:34)
---------------------------------------------
Только вот оно почему-то выводит только первую строку из файла...


Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
SWFcreatorДата: Вторник, 17 Января 2012, 22:39 | Сообщение # 18
участник
Сейчас нет на сайте
Прога ищет в начале каждой строки двоеточие, после него начинает выводить.
masb8ly-GCДата: Вторник, 17 Января 2012, 22:43 | Сообщение # 19
постоянный участник
Сейчас нет на сайте
Все разообрался! Огромнейшее спасибо!)

Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
Форум игроделов » Программирование » C/C++ » Парсинг строки
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2019 Рейтинг