Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 223
#1

[Файлы] Запись-чтение-запись. Почему не прокатывает? - C++

09.05.2014, 14:39. Просмотров 976. Ответов 14
Метки нет (Все метки)

Сначала записываю в файл "а" запись "makulatura", потом читаю ее в строку h. Все ок. Но потом когда открываю файл "a" опять для записи с целью записать строку "mumumu" - ничего не записывается, а только все удаляется(почему удаляется знаю, не знаю почему не записывается).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
    string h;
    fstream a;
    a.open("a.txt", ios_base::out|ios_base::trunc);
    a<<"makulatura";
    a.close();
    a.open("a.txt", ios_base::in);
    a>>h;
    a.close();
    a.open("a.txt", ios_base::out|ios_base::trunc);
    a<<"mumumu";
    a.close();
    system("pause");
    return 0;
    }
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 14:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [Файлы] Запись-чтение-запись. Почему не прокатывает? (C++):

Чтение и запись в файлы - C++
Пусть файл с произвольным именем содержит 10 целых чисел. Написать программу fileprocessor, которая выполняет следующие действия: 1....

Запись и чтение, файлы - C++
Помогите пожалуйста, не могу понять записывается ли в файл что-то и правильно ли я делаю? код собран по кусочкам, из интернета, привожу две...

Файлы (чтение/запись) - C++
Привет всем. Уважаемые программисты! Второй день мучаюсь.. помогите плиз.. Забираю из текстового файла информацию и передаю её в...

Чтение и запись в текстовые файлы. - C++
Доброй ночи всем. Не очень понимаю в си++,щас вот пытаюсь начинать учиться. Может поможет кто. Задание дали такое : Текстовый файл...

Бинарные файлы, чтение и запись - C++
Доброго времени суток. Подскажите пожалуйста, как организовать побайтовое чтение и запись данных в бинарный файл. Правильно ли будет...

Длинная арифметика(чтение и запись в файлы) - C++
Во время выполнения программа вылетает с выдачей ошибки &quot;Необработанное исключение по адресу 0x000B966F в longMult.exe: 0xC0000005:...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
09.05.2014, 14:53 #2
Цитата Сообщение от vab9petryk Посмотреть сообщение
ios_base::trunc
Означает "Все, что было раньше удалить".
Используйте ios_base::app
0
vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 223
09.05.2014, 20:46  [ТС] #3
Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
Означает "Все, что было раньше удалить".
Используйте ios_base::app
Использую. Не помогает. Запись "makulatura" просто остается на месте, а "mumumu" не добавляется.
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
09.05.2014, 20:52 #4
Попообуйте еще ios::ate
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
09.05.2014, 20:54 #5
Цитата Сообщение от vab9petryk Посмотреть сообщение
Использую. Не помогает.
а файл то открывается?
0
Keshander
8 / 8 / 4
Регистрация: 21.04.2014
Сообщений: 31
Завершенные тесты: 1
09.05.2014, 21:09 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
вот код: открывает и записывает вроде все как надо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
    string h;
    fstream a;
    a.open("a.txt", ios::in | ios::app);
    a<<"makulatura ";
    a.close();
    a.open("a.txt", ios::out | ios::app);
    a>>h;
    a.clear();
    a<<" mumumu";
    a.close();
    system("pause");
    return 0;
    }
1
softirqd
0 / 0 / 0
Регистрация: 08.05.2014
Сообщений: 9
09.05.2014, 22:19 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <fstream>
int main(int a, char** s){ 
 
 std::fstream f("z.c");
 if(!f.good()){ exit(-1); };
  f.seekp(0,std::ios::end);
  f<<s[1]
  <<(char)10;
  f.close(); 
  
}
0
vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 223
09.05.2014, 22:57  [ТС] #8
Цитата Сообщение от Keshander Посмотреть сообщение
a.close();
значит весь секрет в этой функции?

Добавлено через 4 минуты
можете на русском языке обьяснить что делает данная функция? В инете нарыл следующие.
void ios::clear(iostate state = goodbit);

Эта функция восстанавливает поток, если он по какой-либо причине оказался в ошибочном состоянии. Например, из потока пытались прочитать число, а там в это время находились буквы. В этом случае, поток переводится в состояние отказа, и дальнейшие операции с ним неосуществимы. В том числе и cin.get(). Функция же clear() «очищает» состояние потока, делая его вновь веселым и работоспособным.
Где у меня поток оказался в ошибочном состоянии?
0
Keshander
8 / 8 / 4
Регистрация: 21.04.2014
Сообщений: 31
Завершенные тесты: 1
10.05.2014, 02:39 #9
нет дело в режиме открытия файлов. режим ios::app для до записи в конец файла. Работает это таким образом что ищет конец файла и дописывает к нему. Но когда мы считываем в переменную h мы читаем весь файл вместе с символом конца файла и поэтому он не видит символ конца файла(так как его уже прочли) и поэтому не дописывает. А функция
clear() фактически возвращает нас в начало файла, и поэтому мы вроде как дописываем.
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.05.2014, 08:50 #10
Цитата Сообщение от vab9petryk Посмотреть сообщение
почему удаляется знаю, не знаю почему не записывается
Цитата Сообщение от vab9petryk Посмотреть сообщение
Где у меня поток оказался в ошибочном состоянии?
C++
1
2
3
    a.open("a.txt", ios_base::in);
    a>>h;
    a.close();
Есть предположение, что у vab9petryk 8-я студия. Код, из первого поста, вполне будет работать с другими компиляторами, но не с компиляторм 8-й студии. В большинстве реализаций, закрытие файла, а потом открытие его, приводят поток в рабочее состояние (сбрасываются флаги всех ошибок). В 8-й же студии, этого недостаточно, и нужно дополнительно деалать clear().
0
vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 223
10.05.2014, 11:55  [ТС] #11
Keshander, но в моем примере я писал без ios::app, у меня a.open("a.txt", ios_base::out|ios_base::trunc);
ios::out|ios::trunc тоже ищут конец файла? Я вижу одну причину, поток засорился, но почему не понимаю

Добавлено через 46 секунд
alsav22, у меня dev c++ 4.9.9.2
0
Keshander
8 / 8 / 4
Регистрация: 21.04.2014
Сообщений: 31
Завершенные тесты: 1
10.05.2014, 12:48 #12
ios::out|ios::trunc это не режим открытия файла для до-записи вроде как. вообще ios::trunc это усечения файла до нулевой длинны. Но вот почему он у тебя не усекался сложно сказать. Сейчас у себя посмотрю работу твоего кода.

Добавлено через 5 минут
Верно ios::trunc усекает файл до нулевого и в результате получается он записывает "makulatura" в файл, потом считывает "makulatura" в h далее снова открывает файл, усекает его до нуулевой длины(делает пустым) и записывает "mumumu".

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
    string h;
    fstream a;
    a.open("a.txt", ios_base::out|ios_base::trunc);
    a<<"makulatura";
    a.close();
    a.open("a.txt", ios_base::in);
    a>>h;
    a.close();
    a.open("a.txt", ios_base::out|ios_base::app);
    a<<" mumumu";
    a.close();
    system("pause");
    return 0;
    }
вот достаточно trunc при 3 открытии заменить на app и все у меня работает как надо.
у меня MS Visual studio 2012 ult. Если у тебя не работает как надо значит видимо косяк компилятора.
1
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.05.2014, 19:51 #13
Цитата Сообщение от vab9petryk Посмотреть сообщение
у меня dev c++ 4.9.9.2
И наблюдается вот это (имеется ввиду, код в первом посте)?
Цитата Сообщение от vab9petryk Посмотреть сообщение
Но потом когда открываю файл "a" опять для записи с целью записать строку "mumumu" - ничего не записывается
Компилятор какой подключен? mingw? Номер его(зайти в папку mingw/bin и посмотреть номер *gcc.exe)?

Добавлено через 1 минуту
Цитата Сообщение от Keshander Посмотреть сообщение
вот достаточно trunc при 3 открытии заменить на app и все у меня работает как надо.
А без замены, что, " mumumu" не записывает?

Добавлено через 25 минут
vab9petryk, вот этот код, что на экран выводит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{
    string h;
    fstream a;
    a.open("a.txt", ios_base::out|ios_base::trunc);
    a<<"makulatura";
    a.close();
    a.open("a.txt", ios_base::in);
    a>>h;
    a.close();
    a.open("a.txt", ios_base::out|ios_base::trunc);
    a<<"mumumu";
    a.close();
    a.open("a.txt", ios_base::in);
    h.clear();
    a >> h;
    cout << h << endl;
    
    system("pause");
    return 0;
}
0
Keshander
8 / 8 / 4
Регистрация: 21.04.2014
Сообщений: 31
Завершенные тесты: 1
10.05.2014, 21:18 #14
alsav22, без замены записывается я же писал, но удаляется предыдущая запись.

Добавлено через 1 минуту
Цитата Сообщение от Keshander Посмотреть сообщение
Верно ios::trunc усекает файл до нулевого и в результате получается он записывает "makulatura" в файл, потом считывает "makulatura" в h далее снова открывает файл, усекает его до нуулевой длины(делает пустым) и записывает "mumumu".
вот здесь писал
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.05.2014, 21:32 #15
Цитата Сообщение от Keshander Посмотреть сообщение
без замены записывается я же писал, но удаляется предыдущая запись.
Это понятно, что у вас, то и у меня. У ТС ввобще не записывается (если брать код из первого поста, без clear()).
Посмотрел я эту Dev C++ (4.9.9.2), там компилятор mingw 3.4.2, реализация сделана так же, как я писал о 8-й студии. Поэтому у ТС работает не так, как у нас. Одного закрытия файла недостаточно, чтобы сбросить флаги, нужно ещё clear() делать.

Добавлено через 1 минуту
vab9petryk, компилятор поновее подключите. Или всю среду, уже с новым компилятором, установите (что лучше): http://orwelldevcpp.blogspot.ru/
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2014, 21:32
Привет! Вот еще темы с ответами:

fwrite\fread: чтение и запись в бинарные файлы - C++
Добрый день. Пытаюсь разобратся с чтением и записью в бинарные файлы.. в общем обрисую в краце проблему, записываю класс. class tPoint ...

Запись/чтение структур (файлы) + разница между FILE * и <fstream> - C++
Всем привет. Порыскал по форуму, погуглил... Решения есть, но они не ясны (что, почему да как) и не все работают. Однако, я так и не нашёл...

Функции и файлы. Чтение и запись данных в файл. Структура "Ноутбук" - C++
Приветствую. Помогите, пожалуйста, с программой. Для хранения данных о ноутбуках описать структуру вида: struct NOTEBOOK{ struct...

Чтение/запись - C++
какая буква в fopen, открывает файл на одновременное чтение/запись, причем если файл существует, то не стирает его


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.05.2014, 21:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru