Пятница, 30 Сентября 2022, 15:28

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Строки в отдельном файле
Строки в отдельном файле
Lord16Дата: Среда, 09 Марта 2016, 15:47 | Сообщение # 1
Gruppo0
Сейчас нет на сайте
Ребят, привет!
Пишу текстовый квест на С++ с библиотекой Qt, сам каркас и функционал почти готовы, а вопрос в следующем:
Как мне реализовать подгрузку текстов из стороннего файла? Не хочу впихивать большие абзацы текста в код, не красиво, да и не практично наверное, хотелось бы сделать по уму. Как это вообще обычно делается и при помощи чего? Ну и рад буду если на коде покажите или дадите линк.
ЭргалонДата: Среда, 09 Марта 2016, 17:22 | Сообщение # 2
Вездесущий
Сейчас нет на сайте
Lord16, При помощи json/xml можно легко подгружать данные и вносить в соответствующие поля.

Кубариум
Rise of the dark lords
SaiteiДата: Среда, 09 Марта 2016, 17:25 | Сообщение # 3
старожил
Сейчас нет на сайте
Цитата Lord16 ()
Пишу текстовый квест на С++ с библиотекой Qt, сам каркас и функционал почти готовы, а вопрос в следующем:
Как мне реализовать подгрузку текстов из стороннего файла? Не хочу впихивать большие абзацы текста в код, не красиво, да и не практично наверное, хотелось бы сделать по уму.

Ты можешь сделать ещё один файл, в котором будут содержаться номера меток. Потом, исходя из логики твоей программы, можно будет искать метку в файле, который содержит сам текст. Профит тут ещё в том, что метки могут быть одни и те же, а файлы с текстом могут быть разные: ты можешь перевести свою игру на какой-либо другой язык
Lord16Дата: Среда, 09 Марта 2016, 17:32 | Сообщение # 4
Gruppo0
Сейчас нет на сайте
Спасибо! буду пробовать smile
Snake174Дата: Четверг, 10 Марта 2016, 10:49 | Сообщение # 5
участник
Сейчас нет на сайте
Прочитать файл целиком:
Код

QFile f("путь к файлу");

if (f.open( QIODevice::ReadOnly ))
{
  QTextStream ts( &f );
  ts.setAutoDetectUnicode( true );
  ts.setGenerateByteOrderMark( false );
  QString s = ts.readAll();
  f.close();
}


Можно запихнуть всё это в QStringList:
Код

QStringList sList = s.split( QRegExp("(\\r\\n)|(\\n\\r)|\\r|\\n"), QString::SkipEmptyParts );


Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games
Lord16Дата: Пятница, 11 Марта 2016, 10:16 | Сообщение # 6
Gruppo0
Сейчас нет на сайте
Snake174, После первого же вызова b_first_slot() выдает:
Программа неожиданно завершилась.
/media/los/d911addc-522c-421d-8c0b-cbce730f7b8b/cpp/qt/quest/game/g2/build-Story-Desktop_Qt_5_5_1_GCC_64bit-Release/Story завершился крахом

Поможешь разобраться в чем ошибка?
Код

//При нажатии кнопки:
void Room_One::b_first_slot()
{
    b1++;
    switch(b1)
    {
    case 1:         reader(0); break;
    case 2:         reader(1); break;
    case 3:         reader(2); break;
    default:        label_text->setText("b1 ушло за предел");
    }
}

void Room_One::reader(int x=0)
{
    QFile f(".//tex/r1-1.txt");

    if(f.open(QIODevice::ReadOnly))
    {
        QTextStream ts(&f);
        ts.setAutoDetectUnicode(true);
        ts.setGenerateByteOrderMark(false);
        QString s = ts.readAll();
        *sList = s.split(QRegExp("m[0-9]{1,2}"), QString::SkipEmptyParts);
        f.close();
    }
    QString str = sList->at(x);
    Room_One::label_text->setText(str);
}


Добавлено (11 марта 2016, 10:16)
---------------------------------------------
В файле r1-1.txt стоят разделители типа:

Много текста...
m01
Mного текста...
m02
...
Ещё текст...


Сообщение отредактировал Lord16 - Пятница, 11 Марта 2016, 10:27
falcowareДата: Пятница, 11 Марта 2016, 10:35 | Сообщение # 7
старожил
Сейчас нет на сайте
Lord16, не желательно указателю на список присваивать список. Лучше без указателя.

https://falco3d.com
Lord16Дата: Пятница, 11 Марта 2016, 11:33 | Сообщение # 8
Gruppo0
Сейчас нет на сайте
falcoware, если правильно тебя понял не в том ошибка. Не спасло.
Snake174Дата: Пятница, 11 Марта 2016, 12:58 | Сообщение # 9
участник
Сейчас нет на сайте
sList зачем в куче создавать?

Код

void Room_One::reader(int x=0)
{
    QFile f(".//tex/r1-1.txt");
    QStringList sList;

    if(f.open(QIODevice::ReadOnly))
    {
        QTextStream ts(&f);
        ts.setAutoDetectUnicode(true);
        ts.setGenerateByteOrderMark(false);
        QString s = ts.readAll();
        sList = s.split(QRegExp("m[0-9]{1,2}"), QString::SkipEmptyParts);
        f.close();
    }

    if (!sList.empty())
      Room_One::label_text->setText( sList.at(x) );
}


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

Про разделители не понял.

Может QSettings подойдёт? Или JSON/XML как советовали выше.

Код

[m01]
Mного текста...
[m02]
...


Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games


Сообщение отредактировал Snake174 - Пятница, 11 Марта 2016, 13:00
Lord16Дата: Пятница, 11 Марта 2016, 13:53 | Сообщение # 10
Gruppo0
Сейчас нет на сайте
Snake174, по JSON и XML не нашел к сожалению инфы на русском, а те что нашел не объясняли как ставить это на линуху, а на ней я не так давно чтоб разобрать самому, вариант что ты предложил кстати показался сразу понятным и логичным. Тоже хотел так сделать, не знал как хд) Теперь всё работает. Спасибо тебе!

Про разделители:


Сообщение отредактировал Lord16 - Пятница, 11 Марта 2016, 14:21
OpenGOOДата: Пятница, 11 Марта 2016, 14:14 | Сообщение # 11
почти ветеран
Сейчас нет на сайте
Скорее всего здесь вылетает
Код
QString str = sList->at(x);
, поскольку список пустой
А причина в том что путь ".//tex/r1-1.txt" кривой.


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
Lord16Дата: Пятница, 11 Марта 2016, 14:17 | Сообщение # 12
Gruppo0
Сейчас нет на сайте
OpenGOO, на линуксах одна косая черта, с путем всё в порядке.

Сообщение отредактировал Lord16 - Пятница, 11 Марта 2016, 14:34
OpenGOOДата: Пятница, 11 Марта 2016, 22:21 | Сообщение # 13
почти ветеран
Сейчас нет на сайте
Цитата Lord16 ()
OpenGOO, на линуксах одна косая черта, с путем всё в порядке.

У тебя две косые, а не одна.

Разобрался уже как файл открыть?


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
Lord16Дата: Пятница, 11 Марта 2016, 22:33 | Сообщение # 14
Gruppo0
Сейчас нет на сайте
OpenGOO, и вправду тут две, а в проекте одна и работает, не помню чтоб менял.
Да, вопросов не имею, как подсказал Snake174, так оно и работает))
SkmDeveloperДата: Вторник, 29 Марта 2016, 08:58 | Сообщение # 15
частый гость
Сейчас нет на сайте
Цитата Lord16 ()
OpenGOO, на линуксах одна косая черта, с путем всё в порядке.


Есть такая статическая функция, чтоб точно определить разделитель путей.

QChar QDir::separator();

Возвращает "/" в Unix и "\" в Windows. Лучше ее вызвать и преобразовать результат в QString, а не использовать символы.
GudleifrДата: Вторник, 29 Марта 2016, 10:21 | Сообщение # 16
почти ветеран
Сейчас нет на сайте
Это все напоминает очень плохой анекдот. Язык C (и C++, как его "развитие") создан как часть ОС Unix и, следовательно, изначально не умел ничего вводить (в т.ч. от пользователя) иначе, чем через файл. И, вот, новые библиотеки, извращаясь в своей "переносимости" это делать разучились. Причем, иногда это можно было бы оправдать, если бы они всерьез что-то делали, а не просто играли в фантики. Например в Win API проще читать дисковые файлы через механизм управления виртуальной памятью.

Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
SkmDeveloperДата: Вторник, 29 Марта 2016, 18:46 | Сообщение # 17
частый гость
Сейчас нет на сайте
Цитата Gudleifr ()
Это все напоминает очень плохой анекдот. Язык C (и C++, как его "развитие") создан как часть ОС Unix и, следовательно, изначально не умел ничего вводить (в т.ч. от пользователя) иначе, чем через файл.


Все как раз наоборот Концепция UNIX - "все является файлом", а не "ничего кроме файлов".
GudleifrДата: Вторник, 29 Марта 2016, 19:53 | Сообщение # 18
почти ветеран
Сейчас нет на сайте
Цитата SkmDeveloper ()
"все является файлом", а не "ничего кроме файлов"
Это логически (и программистски) эквивалентные выражения. Так что никаких "наоборот" тут быть не может.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
SkmDeveloperДата: Вторник, 29 Марта 2016, 20:36 | Сообщение # 19
частый гость
Сейчас нет на сайте
Смотря что называть файлом. В UNIX это понятие намного шире, чем в Windows.
GudleifrДата: Вторник, 29 Марта 2016, 20:51 | Сообщение # 20
почти ветеран
Сейчас нет на сайте
Цитата SkmDeveloper ()
Смотря что называть файлом.
См. мой пост в этой теме.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Форум игроделов » Программирование » C/C++ » Строки в отдельном файле
  • Страница 1 из 1
  • 1
Поиск:

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