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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с записью в файл 
V
    Опции темы
Vaz007
Дата 3.9.2013, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый вечер. Есть проблема в записи в файл.
Сначала рабочий вариант:
Groupa - класс состоящий из вектора указателей на студентов
Код

std::vector <Student *> group;


В классе Student есть функция записи в файл (класс Student имеет данные имя , возраст)

Код

        Groupa group;
    Student *p;

    std::ifstream out("E:\student.txt");
    std::ofstream in("E:\writefile.txt");
    
    p = new Student();
    std::cin >>*p;
    
    group.Add(*p);// обычное добавление в вектор
    group.Write(in);// описание функции дано ниже

Запись в файл происходит.

А теперь код ,который мне нужен, не понимаю, почему не работает запись.

Код

    Showmenu();
    char choice;
    std::cin >>choice;
    while(choice!='f' || choice!='F')
    {
        tolower(choice);
        switch(choice)
        {
            case 'a':
                p = new Student();
                std::cin >> *p;
                group.Add(*p);
                break;

            case 'b':
                group.Show();
                break;

            case 'c':
                group.Read(out);// считывание работает
                break;

            case 'd':
                group.Write(in); // эта запись почему-то нет
                
                break;

            case 'e':
                group.Clear();
                break;

            default:
                std::cin.clear();
                std::cin.ignore(256,'\n');
                std::cout <<"Hello from default!!" <<std::endl;

        }
         Showmenu();
         std::cin >>choice;
    }


// методы ,которые я использую для записи в файл

void Groupa::Write(std::ofstream & Filein)
{
    for(int i=0;i<group.size();++i)
        group[i]->WriteFile(Filein);
}

void Student::WriteFile(std::ofstream & inFile)
{
    if(!inFile.is_open())
    {
        std::cout<<"Couldn't open file!!" <<std::endl;
        std::cout <<"Failure!!" <<std::endl;
        exit(0);
    }

    if(inFile.good())
        inFile << name <<"\n" << age <<"\n";



Помогите пожалуйста разобраться.
PM MAIL Jabber   Вверх
feodorv
Дата 3.9.2013, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Vaz007 @  3.9.2013,  20:35 Найти цитируемый пост)
    while(choice!='f' || choice!='F')

Хотя бы одно условие обязательно будет выполнено.
Должно быть, имелось в виду
Код

    while(choice!='f' && choice!='F')


Добавлено через 4 минуты и 55 секунд
Цитата(Vaz007 @  3.9.2013,  20:35 Найти цитируемый пост)
        tolower(choice);

А тут, наверное, так:
Код

        choice = tolower(choice);


Добавлено через 8 минут и 19 секунд
Цитата(Vaz007 @  3.9.2013,  20:35 Найти цитируемый пост)
не понимаю, почему не работает запись.

Вы бы выдали отладочную информацию:
Код

            case 'd':
                cout << "Writing into file" << endl;
                group.Write(in);
                break;

А то вдруг до group.Write(in) дело не доходит...

Добавлено через 10 минут и 56 секунд
Цитата(Vaz007 @  3.9.2013,  20:35 Найти цитируемый пост)
    std::ifstream out("E:\student.txt");
    std::ofstream in("E:\writefile.txt");

А здесь нужны двойные слэши:
Код

    std::ifstream out("E:\\student.txt");
    std::ofstream in("E:\\writefile.txt");


Добавлено через 12 минут и 55 секунд
А ещё нужно проверять, что in и out были открыты без ошибок...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Vaz007
Дата 3.9.2013, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо за замечания исправил. 
Фото отладки сейчас выложу

Добавлено через 28 секунд
Фото1

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  otl.jpg 73,79 Kb
PM MAIL Jabber   Вверх
Vaz007
Дата 3.9.2013, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Фото2

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  otl2.jpg 31,44 Kb
PM MAIL Jabber   Вверх
Vaz007
Дата 3.9.2013, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Фото3
Запись не работает все равно.

Это сообщение отредактировал(а) Vaz007 - 3.9.2013, 22:55

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  otl3.jpg 43,25 Kb
PM MAIL Jabber   Вверх
akizelokro
Дата 4.9.2013, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Проверь значение "age" и строчку

Код

std::cin >> *p;



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
feodorv
Дата 4.9.2013, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Vaz007 @  3.9.2013,  23:35 Найти цитируемый пост)
Запись не работает все равно.

Всё-таки продублируйте выдачу на экран:
Код

void Student::WriteFile( std::ofstream & inFile )
{
  ...
  if( inFile.good() )
  {
    std::cout << name << "\n" << age << "\n";
    inFile << name << "\n" << age << "\n";
  }
}



Цитата(Vaz007 @  3.9.2013,  23:35 Найти цитируемый пост)
Запись не работает все равно.

В чём конкретно это выражается? Файла нет? Файл создаётся, но он пустой? Двойные слэши поправили?

Это сообщение отредактировал(а) feodorv - 4.9.2013, 09:41


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Vaz007
Дата 4.9.2013, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



файл создается , но он пустой. слэши поправил

Это сообщение отредактировал(а) Vaz007 - 4.9.2013, 12:43
PM MAIL Jabber   Вверх
akizelokro
Дата 4.9.2013, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



flush сделай перед закрытием файла

и что у тебя там пишется в класс в этой строчке? ты для класса Sudent перегрузку оператора ">>" делал?
Если нет, то всё что угодно может записаться.  Например, name будет нормальным по значению, а вот age - непонятно что.

Это сообщение отредактировал(а) akizelokro - 4.9.2013, 13:28


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Vaz007
Дата 4.9.2013, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



после flush заработал ))) только объясните почему??
PM MAIL Jabber   Вверх
akizelokro
Дата 4.9.2013, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(Vaz007 @  4.9.2013,  18:21 Найти цитируемый пост)
после flush заработал ))) только объясните почему?? 


На этом часто при изучении материала накалываются.
Используется буфферизация ввода-вывода, при записи в файл нужно "сбросить" содержимое буфера записи на жёсткий диск в файл перед завершением работы.

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

Это сообщение отредактировал(а) akizelokro - 4.9.2013, 20:06


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Vaz007
Дата 4.9.2013, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



akizelokro, огромное спасибо))
PM MAIL Jabber   Вверх
SenkraD
Дата 5.9.2013, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну вообще-то стримы в деструкторах вызывают flush и close (не во всех реализациях явно, могут через свои буферы этто делать), так что скорее всего если смотреть сразу после прохождения строки в режиме трасировки, то файл мог не обновляться, но по выходу с области видимости стримового обьекта, он ДОЛЖЕН был записываться и обновляться


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
xvr
Дата 5.9.2013, 13:45 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(akizelokro @  4.9.2013,  19:57 Найти цитируемый пост)
Почему это не делается автоматически, я тебе не скажу.

Подозреваю, что программе нормально завершиться не дают. Например она слетает по исключению или ее банально прибивают по Ctrl-C  smile 

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


Крокодил
**


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

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



Цитата

Подозреваю, что программе нормально завершиться не дают. Например она слетает по исключению или ее банально прибивают по Ctrl-C  smile 


Я текста программы не вижу. Я прочитал, что поток ввода открывается в функции и должен закрываться, предположу, в функции.
Автоматически синхронизация буфера вывода осуществляется в 4 случаях:
<< endl;

<< flush;

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

Здесь случай достаточно нестандартный. Пишут не '\n', а std::endl в подавляющем большинстве случаев и также в подавляющем большинстве случаев рассматриваются программы для начинающих в консольном режиме, где потоки открываются в main и с ним же закрываются.

Добавлено через 10 минут и 50 секунд
Щас глянул полседнюю прогу. Оказалось, что я у себя везде flush'у перед close.
Но я не особо лихой программист. Правда, у меня и проблем что чего-то не записалось, не бывает никахда. smile 

Это сообщение отредактировал(а) akizelokro - 5.9.2013, 14:43


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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