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

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

Восстановить пароль Регистрация
 
vab9petryk
 Аватар для vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 212
09.05.2014, 14:39     [Файлы] Запись-чтение-запись. Почему не прокатывает? #1
Сначала записываю в файл "а" запись "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;
    }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 14:39     [Файлы] Запись-чтение-запись. Почему не прокатывает?
Посмотрите здесь:

Чтение и запись в текстовые файлы. C++
двоичные файлы,чтение\запись C++
Бинарные файлы, чтение и запись C++
Запись и чтение, файлы C++
fwrite\fread: чтение и запись в бинарные файлы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,161
Завершенные тесты: 1
09.05.2014, 14:53     [Файлы] Запись-чтение-запись. Почему не прокатывает? #2
Цитата Сообщение от vab9petryk Посмотреть сообщение
ios_base::trunc
Означает "Все, что было раньше удалить".
Используйте ios_base::app
vab9petryk
 Аватар для vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 212
09.05.2014, 20:46  [ТС]     [Файлы] Запись-чтение-запись. Почему не прокатывает? #3
Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
Означает "Все, что было раньше удалить".
Используйте ios_base::app
Использую. Не помогает. Запись "makulatura" просто остается на месте, а "mumumu" не добавляется.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,161
Завершенные тесты: 1
09.05.2014, 20:52     [Файлы] Запись-чтение-запись. Почему не прокатывает? #4
Попообуйте еще ios::ate
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
09.05.2014, 20:54     [Файлы] Запись-чтение-запись. Почему не прокатывает? #5
Цитата Сообщение от vab9petryk Посмотреть сообщение
Использую. Не помогает.
а файл то открывается?
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;
    }
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(); 
  
}
vab9petryk
 Аватар для vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 212
09.05.2014, 22:57  [ТС]     [Файлы] Запись-чтение-запись. Почему не прокатывает? #8
Цитата Сообщение от Keshander Посмотреть сообщение
a.close();
значит весь секрет в этой функции?

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

Эта функция восстанавливает поток, если он по какой-либо причине оказался в ошибочном состоянии. Например, из потока пытались прочитать число, а там в это время находились буквы. В этом случае, поток переводится в состояние отказа, и дальнейшие операции с ним неосуществимы. В том числе и cin.get(). Функция же clear() «очищает» состояние потока, делая его вновь веселым и работоспособным.
Где у меня поток оказался в ошибочном состоянии?
Keshander
8 / 8 / 4
Регистрация: 21.04.2014
Сообщений: 31
Завершенные тесты: 1
10.05.2014, 02:39     [Файлы] Запись-чтение-запись. Почему не прокатывает? #9
нет дело в режиме открытия файлов. режим ios::app для до записи в конец файла. Работает это таким образом что ищет конец файла и дописывает к нему. Но когда мы считываем в переменную h мы читаем весь файл вместе с символом конца файла и поэтому он не видит символ конца файла(так как его уже прочли) и поэтому не дописывает. А функция
clear() фактически возвращает нас в начало файла, и поэтому мы вроде как дописываем.
alsav22
5282 / 4801 / 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().
vab9petryk
 Аватар для vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 212
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
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. Если у тебя не работает как надо значит видимо косяк компилятора.
alsav22
5282 / 4801 / 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;
}
Keshander
8 / 8 / 4
Регистрация: 21.04.2014
Сообщений: 31
Завершенные тесты: 1
10.05.2014, 21:18     [Файлы] Запись-чтение-запись. Почему не прокатывает? #14
alsav22, без замены записывается я же писал, но удаляется предыдущая запись.

Добавлено через 1 минуту
Цитата Сообщение от Keshander Посмотреть сообщение
Верно ios::trunc усекает файл до нулевого и в результате получается он записывает "makulatura" в файл, потом считывает "makulatura" в h далее снова открывает файл, усекает его до нуулевой длины(делает пустым) и записывает "mumumu".
вот здесь писал
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2014, 21:32     [Файлы] Запись-чтение-запись. Почему не прокатывает?
Еще ссылки по теме:

Запись/чтение структур (файлы) + разница между FILE * и <fstream> C++
C++ Длинная арифметика(чтение и запись в файлы)
C++ Файлы (чтение/запись)

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 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/
Yandex
Объявления
10.05.2014, 21:32     [Файлы] Запись-чтение-запись. Почему не прокатывает?
Ответ Создать тему
Опции темы

Текущее время: 20:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru