Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как лучше хранить текст в файлах 
:(
    Опции темы
ZC1989
Дата 25.1.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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

получется что-то вроде этого в файле
Код

REPORT{
    NAME       Какое-то_имя_человека
    TEXT         Тут_скажем_находится_набранный_им_текст
}


как видно из этого минимального примера, в место пробелов используется андерлайн... просто когда я читалкой прохожучь по файлу получаю "Какое-то_имя_человека" в переменную и заменяю на нормальные пробелы эти подчёркивания...

это сразу лишает возможности использовать "_" в тексте, если его даж и набрать, потом он будет заменён... вот как лучше такие файлы организовывать?

есть мысля, что не символы просто сохранять, а код этих символов, это как вообще, нормальная идея?

Это сообщение отредактировал(а) ZC1989 - 25.1.2007, 13:15


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Anikmar
Дата 25.1.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Можно сделать структурами.
Первая структура - заголовок файла
Потом структура списка людей.
При таком подходе - любые символы и служебная информация будут храниться без проблем
PM MAIL ICQ   Вверх
ip127001
Дата 25.1.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



struct+vector+fstream

проблема не совсем ясна... smile 
приведи конкредный пример ввода и нужного вывода

--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
ZC1989
Дата 25.1.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



ip127001,  я хочу теоретически разобрать эту делему... потому что читаю немного разными способами...

строка может содеражть не только название (что бы быть уверенным в чтении) но и некоторые параметры

пример:
загаловок     текст    параметр1   параметр2

если скжет строка будет иметь вид

NAME    test    1    0

то тут всё пучком, text будет прочитано в строку, первый и второй паматры расшифруются (к примеру это мой enum) и всё будет работать как положено, но если будет записана строка

NAME    test bad    1    0

то тот же ifstream передаст в строку только text, в первый паметр bad а во второй 1, последний же параметр вообще пропадёт... для этого и пишу text_bad, что бы текстовая строка не разрывалась на 2 слова smile 

яснее объяснил проблем?


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Anikmar
Дата 25.1.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



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

Например, в файле могут быть соранены несколько параметров? содержащих имя и два int
Затем несколько параметров, содержащих имя и 3 int, неограниченное количество строк.

Тогда формат файла можно представить как-нибудь так:
int - Количество параметров 1-го типа
Массив структур для данных 1-го типа
int - Количество параметров 2-го типа
Массив структур параметров 2-го типа
int - Количество произвольных строк 
Массив строк

Либо универсальная структура, которая может содержать внутри себя все типы параметров (потребует больше памяти)
{
int Type;
int Param1;
int Param2;
int Param3;
char string[250];
}

В общем вариантов для раздумий уйма. Например, как лучше хранить строку (т.е. структуры переменного размера) и т.п.

PM MAIL ICQ   Вверх
ZC1989
Дата 25.1.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



Anikmar, получается что я должен буду как-то разобрать содержимое в строке, получается не совсем цикл к которому я привык... smile 
Цитата

Например, в файле могут быть соранены несколько параметров?


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

NAME    2321665361727217836763635623661231832736712    1    0

но в то же время не совсем уверен в правильности... а тот вариант что ты предложил мне кажется не оч практичным, если будет та же ерунда с "text bad" помоему, глюка даст это...  smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Anikmar
Дата 25.1.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Тяжело что-то советовать не зная постановки задачи.

Какие данные надо сохранять?

Например, можно воспользоваться готовым ini файлом и забыть про парсинг...
PM MAIL ICQ   Вверх
KelTron
Дата 25.1.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



а можно в файле записать, например, так
Код

NAME    test bad;    1    0

и считывать так:
Код

string str;
getline(file, str, ';');
file >> par1;
file >> par2;

Вряд ли тебе в имени нужно хранить ';' поэтому его удобно использовать в качестве разделителя


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Anikmar
Дата 25.1.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Если файл планируется набирать вручную, то можно оставить текстовый формат.
А вот если файл создается из программы, то никакого смысла не вижу хранить тот же float в текстовом виде.
PM MAIL ICQ   Вверх
ip127001
Дата 25.1.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



Цитата(ZC1989 @  25.1.2007,  14:33 Найти цитируемый пост)
NAME    test    1    0

то тут всё пучком, text будет прочитано в строку, первый и второй паматры расшифруются (к примеру это мой enum) и всё будет работать как положено, но если будет записана строка

NAME    test bad    1    0

то тот же ifstream передаст в строку только text, в первый паметр bad а во второй 1, последний же параметр вообще пропадёт... для этого и пишу text_bad, что бы текстовая строка не разрывалась на 2 слова  

яснее объяснил проблем?

ок..теперь все понятно...можно попробывать ввести стоп-символы которые будут разграничевать
элементы строки...
пр.
Name|parameters..


ввод:
введите имя файла: 1.txt // ;жмешь ентер прога добавляет после имени стоп-символ(|)
и спомощью append добавляешь параметры....
у тя получиться стринговая переменная которая будет выглядеть примерно так
1.txt|1 2 3 213 3254 rgds trh
так ее в файл и кинешь
потом из файла считаешь и с опираясь на стоп символ раскидаешь строку....самый просто способ помоему...немного правда неэлегантный)) smile

Добавлено @ 15:03 
и будет тебе цикл)))

Добавлено @ 15:04 
Цитата(KelTron @  25.1.2007,  14:53 Найти цитируемый пост)
а можно в файле записать, например, так

Без подсветки    
1:    
NAME    test bad;    1    0    

и считывать так:

код C++    
1:    
2:    
3:    
4:    
string str;    
getline(file, str, ';');    
file >> par1;    
file >> par2;    

Вряд ли тебе в имени нужно хранить ';' поэтому его удобно использовать в качестве разделителя


во келтрон мене чуть опередил)

--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
Voldemar2004
Дата 25.1.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Строго не судите:
Код
#include <stdio>

#include <iostream>
#include <sstream>

class Class
{

std::stringstream buffer;

public:

void Add(char*);
std::string  Show(void);

};


void Class::Add(char *FileName)
{

FILE *in;

in = fopen(FileName, "rt");

   char Fam[100];
   char info[100];

        do
        {
        fscanf(in, "%s%s", &Fam, &info);
        buffer << Fam << " " << info << '\n';
        }
        while (!feof(in));

fclose(in);

}



std::string Class::Show(void)
{

return buffer.str();

}


int main()
{

Class My;

My.Add("D:\\Text");

std::cout << My.Show();

std::cin.get();

return 0;
}



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Vyacheslav
Дата 25.1.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Код

#include<iostream>
#include<iterator>
#include <algorithm>
#include <fstream>
#include<vector>

#pragma hdrstop
using namespace std;

struct MyClass {
    MyClass( string name, string text, int param1, int param2):
        name_(name), text_(text),param1_(param1), param2_(param2) {}
    MyClass(){}
    string name_;
    string text_;
    int param1_;
    int param2_;
};


ostream& operator<<( ostream& stream, const MyClass&  myClass)
{
    stream << myClass.param1_ << ' ';
    stream << myClass.param2_ << ' ';
    stream << myClass.name_.length() << ' ';
    stream << myClass.text_.length() << ' ';
    stream << myClass.name_ <<  myClass.text_;

    return stream;
}

istream& operator>>( istream& stream, MyClass&  myClass)
{
    int length1;
    int length2;
    stream >> myClass.param1_ >> myClass.param2_ >> length1 >> length2;
    if(!stream.eof()) {
        auto_ptr<char> tmp( new char[ length1 + length2 + 2 ]);
        stream.getline(tmp.get(), length1 + length2 + 2 );
        string str( tmp.get());
        myClass.name_ = str.substr(1,length1);
        myClass.text_ = str.substr(length1+1);
    }
    return  stream;
}

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
    {
        vector<MyClass> v;
        v.push_back( MyClass("aaa1","bbb1 ccc1 ddd1", 1,1) );
        v.push_back( MyClass("aaa2","bbb2 ccc2 ddd2", 2,2) );
        v.push_back( MyClass("aaa3","bbb3 ccc3 ddd3", 3,3) );
        v.push_back( MyClass("aaa4","bbb4 ccc4 ddd4", 4,4) );

        // тестовый вывод на консоль
        copy(v.begin(),v.end(),ostream_iterator<MyClass>(cout,"\n"));

        //сохранение в файле
        ofstream os( "test.txt");
        copy(v.begin(),v.end(),ostream_iterator<MyClass,char>(os,"\n"));
    }
    {
     vector<MyClass> v;

     //чтение из файла
     ifstream is( "test.txt");
     copy(istream_iterator<MyClass,char>(is), istream_iterator<MyClass, char>(), inserter(v, v.begin()));

     // тестовый вывод на консоль
     cout << v.size() << endl;
     copy(v.begin(),v.end(),ostream_iterator<MyClass, char >(cout,"\n"));
    }

 }




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
VectorMan
Дата 25.1.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antihero
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 9.4.2006

Репутация: 1
Всего: 4



можно использовать xml  smile 
PM   Вверх
Rockie
Дата 25.1.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(VectorMan @  25.1.2007,  18:57 Найти цитируемый пост)
можно использовать xml  smile  

VectorMan, то, что доктор прописал smile

XML




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
ZC1989
Дата 25.1.2007, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



Rockie, дайте вам волю вы тут придёте ещё к HTML разметке... smile 

проблем в том что во первых я не горю желаением использовать символы для пробелов или разделения каких-то параметров от строк... - это черевато во первх не возможностью использовать этот символ, во вторых не практично просто...

тут некоторые сказали что использовать надо в конце ; - а если этот символ будет через пробел написан в тексте... получается ошибочная трактовка читалкой... smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.