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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение и запись в файл в с++, не могу прочитать данные 
V
    Опции темы
Winte
Дата 13.6.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток!
Возникла проблема при чтении данных из файла.  Бьюсь над её решением немыслимо долго.
Вот код:
Код

vector<string> dataBase::get_data(string m_sFileName)
{
    vector<string> data;
    fstream myFile;
    myFile.open(m_sFileName.c_str(), ios_base::in | ios_base::out);
    
    if (myFile.is_open())
    {
        while (!myFile.eof())
        {
            string tmp;
            getline(myFile, tmp);
            if (tmp.size() == 0)
            {
                continue;
            }
            else 
            {
                //cout << tmp << endl;
                data.push_back(tmp.data());
            }
        }
        myFile.close();
    }
    else
    {
            ///////////////////
    }

    return data;
}

вот перед тем как засунуть строку в массив, я выводил её на экран - всё было хорошо. 
После того как я вызываю этот метод и пытаюсь вывести данные на консоль:
Код

vector<string> myContact = base.get_data(m_sFileName);
    for (vector<string>::iterator i = myContact.begin(); i!=myContact.end(); ++i)
    {
        if (i->size()==0)
        {
            continue;
        }
        else
        {
            cout<<i->data()<<endl;
        }
    }

у меня только пустые строки (((
В деббагере я просматривал данные - в переменной tmp и массиве только пустые строки (""), но переменную из потока вывести получается, а элементы массива нет.
данные в файле записаны след образом:
Код

 voronov 
 258212 
 good boys 

в конце каждого стоит символ конца строки "\n"
Кто-нибудь знает решение этой проблемы?

Это сообщение отредактировал(а) Winte - 13.6.2009, 19:58
PM MAIL   Вверх
ISergeyN
Дата 13.6.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



так попробуй
Код

    getline(myFile, tmp);
    if (tmp.empty())
        continue;
    else 
        data.push_back(tmp);

PM MAIL Skype   Вверх
Winte
Дата 13.6.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ISergeyN @ 13.6.2009,  20:00)
так попробуй
Код

    getline(myFile, tmp);
    if (tmp.empty())
        continue;
    else 
        data.push_back(tmp);

не работает! у меня уже едет крыша - в деббагере даже пустая строка проходит эту проверку и записывается в массив.
ещё варианты?
PM MAIL   Вверх
Alca
Дата 13.6.2009, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

std::vector<std::string> vecsReadFile(const std::string &csFilePath) {
    std::vector<std::string> vecRes;
    std::string              sStr("");
    std::ifstream            ifsStream(csFilePath.c_str());
    if (!ifsStream || ifsStream.fail() || !ifsStream.good() || !ifsStream.is_open() || ifsStream.eof()) {
        assert(false);
    }    

    for (int i = 0; !ifsStream.eof();  ++ i) {
        std::getline(ifsStream, sStr);
        vecRes.push_back(sStr);
    }

    return vecRes;
}



--------------------
PM WWW ICQ Skype Jabber   Вверх
triclosan
Дата 13.6.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

data.push_back(tmp.data());


А зачем метод data() используете, ведь тип элементов вектора string, а не char*
PM MAIL   Вверх
azesmcar
Дата 13.6.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Winte

С кодом все нормально, ну не совсем нормально..но работать должен.
Проверьте файл, существует ли он на самом деле и если существует то удостоверьтесь что вы открывает правильный файл. Для начала подойдет передать функции полный путь к файлу.
Например
Код

obj->get_data("C:\\1.txt");

Далее, если все верно попробуйте сделать полный ребилд проекта, перезапустить компилятор, иногда такое бывает. 
Код

tmp.size() == 0

вот это нехорошо, есть функция empty()
и зачем нужен вызов функции data()? 
вобщем измените код как показал
ISergeyN, так правильнее, но и ваш вариант рабочий.

Добавлено через 2 минуты и 7 секунд
и еще..зачем нужен ios_base::out если файл только читается?

PM   Вверх
zim22
Дата 13.6.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



после этой строки
Код

vector<string> myContact = get_data(m_sFileName);

myContact содержит 3 элемента string со значениями
Код

myContact[0]: voronov 
myContact[1]: 258212 
myContact[2]: good boys

дальше в цикле они успешно выводятся на экран
Код

cout<<*i<<endl;

у меня MSVC 2008.


--------------------
PM MAIL   Вверх
azesmcar
Дата 13.6.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



и по поводу возвращения финкией вектора стоит почитать вот это
просто как информация

PM   Вверх
Winte
Дата 13.6.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Alca @ 13.6.2009,  20:21)
Код

std::vector<std::string> vecsReadFile(const std::string &csFilePath) {
    std::vector<std::string> vecRes;
    std::string              sStr("");
    std::ifstream            ifsStream(csFilePath.c_str());
    if (!ifsStream || ifsStream.fail() || !ifsStream.good() || !ifsStream.is_open() || ifsStream.eof()) {
        assert(false);
    }    

    for (int i = 0; !ifsStream.eof();  ++ i) {
        std::getline(ifsStream, sStr);
        vecRes.push_back(sStr);
    }

    return vecRes;
}

код запускается, но также как и мой выводит только пустые строчки.
ещё варианты?

Добавлено через 10 минут и 19 секунд
Цитата(zim22 @  13.6.2009,  20:32 Найти цитируемый пост)
:
    
cout<<*i<<endl;

zim22 , спасибо - после этой строчки заработало.

Цитата(azesmcar @  13.6.2009,  20:29 Найти цитируемый пост)
вот это нехорошо, есть функция empty()
и зачем нужен вызов функции data()? 
вобщем измените код как показал

azesmcar, благодарю за советы, изменения в код внёс.

теперь возник ещё вопрос: разве мой вариант вывод данных был неверен? почему-то только после замены строчки:
Код

cout<<i->data()<<endl;

на
Код

cout<<*i<<endl;

данные были выведены в консоль
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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