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

fstream не работает и чтение и запись - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.97
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
17.03.2012, 12:51     fstream не работает и чтение и запись #1
Добрый день! Не пойму, почему введение функции getline становится причиной того, что запись в файл не идет. Если getline убрать, то все нормально.

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
#include <vcl>
#include <fstream>
#include <iostream>
#include <string>
#pragma hdrstop
 
using namespace std;
 
 
#pragma argsused // No warning if function args are not in use.
// But there is no warning while compiling project. Why?
int _tmain(int argc, _TCHAR* argv[]) {
 
    fstream fs;
    fs.open("test.txt", ios_base::in | ios_base::out | ios_base::app);
    string curr;
    getline(fs, curr);
    cout << curr << endl;
    int s = 1, t = 2;
    fs << s << t << "\n\n"; // It is failed every time
 
    fs.close();
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2012, 12:51     fstream не работает и чтение и запись
Посмотрите здесь:

запись/чтение структуры через fstream C++
fstream: открытие на запись C++
C++ Запись в файл fstream
Запись/чтение структур (файлы) + разница между FILE * и <fstream> C++
Заменить чтение из файла аналогом fstream C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
17.03.2012, 12:55     fstream не работает и чтение и запись #2
Red Planet, не знаю точно можно ли сразу открывать на чтение, запись и дозапись - по крайней мере получится каша. В данном случае причина именно в этом
делай лучше все поочередно (либо записывай, либо читай)
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
17.03.2012, 13:08  [ТС]     fstream не работает и чтение и запись #3
sandye51, сейчас так и делаю: использую в паре ifsream/ofstream. Сейчас получилось использовать fstream, чтение и запись идет. Однако файл должен заканчиваться пустой строкой, в противном случае запись не пройдет.

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
#include <vcl>
#include <fstream>
#include <iostream>
#include <string>
#pragma hdrstop
 
using namespace std;
 
 
#pragma argsused // No warning if function args are not in use.
// But there is no warning while compiling project. Why?
int _tmain(int argc, _TCHAR* argv[]) {
 
    fstream fs;
    fs.open("test.txt", ios_base::in);
    string curr;
    getline(fs, curr);
    cout << curr << endl;
    fs.close();
    fs.open("test.txt", ios_base::app);
    int s = 1, t = 2;
    fs << s << "\n" << t;
    fs.close();
    system("pause");
}
Теперь вопрос, правильно ли так использовать fstream или код бредовый.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.03.2012, 13:54     fstream не работает и чтение и запись #4
после getline поток может перейти в состояние eofbit. поэтому, перед последущей записью в этот поток нужно сделать
C++
1
2
    if(fs.eof())
        fs.clear();
и переоткрывать файл не нужно
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
17.03.2012, 14:21  [ТС]     fstream не работает и чтение и запись #5
Цитата Сообщение от retmas Посмотреть сообщение
и переоткрывать файл не нужно
А как поступить, если файл был открыт на чтение, а потом понадобилось записать в него?
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.03.2012, 14:39     fstream не работает и чтение и запись #6
я писал о таком открытии
Цитата Сообщение от Red Planet Посмотреть сообщение
fs.open("test.txt", ios_base::in | ios_base::out | ios_base::app);
и отвечал
Цитата Сообщение от Red Planet Посмотреть сообщение
почему введение функции getline становится причиной того, что запись в файл не идет
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
17.03.2012, 15:50  [ТС]     fstream не работает и чтение и запись #7
Я не понимал эту запись

Цитата Сообщение от retmas Посмотреть сообщение
ios_base::in | ios_base::out | ios_base::app)
Это ведь просто для примера показано, какие параметры могут быть в качестве ios_base::openmode (или ios_base::in, или out, или append).

Хочу еще спросить о вводе/выводе. Прочитал о функции flush(), терминология неясна.

"Она принудительно записывает содержимое буфера, связанного с потоком, на устройство вывода," - пишет Герберт Шилдт.

Я правильно понял? Устройство вывода здесь - файл, в который идет запись.

А это на самом деле запись в некий низкоуровневый буфер (basic_filebuf или нет?).
Код
somefile << "Lorem ipsum..."
Когда мы делаем flush(), то все, что оставалось в буфере, записывается в файл, т. о., буфер освобождается для последующего внесения туда информации, которая тоже будет записана в файл.

Я правильно представил себе работу потока вывода или нет?

А моя задача решена. Нужно было записать в файл определенную первую строку.

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
27
28
29
30
31
32
33
34
#include <vcl>
#include <fstream>
#include <iostream>
#include <string>
#pragma hdrstop
 
using namespace std;
 
#pragma argsused // No warning if function args are not in use.
 
// But there is no warning while compiling project. Why?
int _tmain(int argc, _TCHAR* argv[]) {
    fstream fs("test.txt", ios_base::in);
    string must_be = "Must be the first line";
    string first_line;
 
    if (fs.good()) { // If file stats.txt exists line will be read
        cout << "File exists. Let\'s check first line" << endl;
        getline(fs, first_line);
    }
 
    if (first_line != must_be) { // Let's set the first line
        fs.close();
        fs.open("test.txt", ios_base::out);
        fs.clear();
 
        fs << must_be << "\n";
        cout << "First line was changed to " << must_be << "\n";
    }
    else cout << "The first line is correct" << endl;
    if (fs.is_open()) fs.close();
 
    system("pause");
}
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.03.2012, 16:09     fstream не работает и чтение и запись #8
Цитата Сообщение от Red Planet Посмотреть сообщение
Я правильно понял? Устройство вывода здесь - файл, в который идет запись.
устройство вывода это либо экран консоли, либо жесткий диск.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.03.2012, 16:10     fstream не работает и чтение и запись #9
Цитата Сообщение от Red Planet Посмотреть сообщение
Это ведь просто для примера показано, какие параметры могут быть в качестве ios_base::openmode (или ios_base::in, или out, или append).
это не для примера показано. здесь задается вполне определённый режим открытия файла. нет тут никаких "или"(читай альтернатив). файл открывается для чтения и дозаписи(в конец)
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
17.03.2012, 16:21  [ТС]     fstream не работает и чтение и запись #10
Цитата Сообщение от retmas Посмотреть сообщение
файл открывается для чтения и дозаписи(в конец)
Тогда не понимаю, почему запись не идет дозапись в конец.

C++
1
2
3
4
5
fstream fs("test.txt", ios::in | ios::app);
string s;
fs >> s;
fs << "Ipsum" << "\n";
fs.close();
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.03.2012, 16:23     fstream не работает и чтение и запись #11
Цитата Сообщение от Red Planet Посмотреть сообщение
Тогда не понимаю, почему запись не идет запись.
Потому что файл открыт только на чтение.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.03.2012, 16:30     fstream не работает и чтение и запись #12
ios::app указывает, что запись будет происходить в конец, но не указывает, что запись вообще будет. имеет смысл только при наличии ios::out
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
17.03.2012, 17:50  [ТС]     fstream не работает и чтение и запись #13
Цитата Сообщение от retmas Посмотреть сообщение
ios::app указывает, что запись будет происходить в конец, но не указывает, что запись вообще будет. имеет смысл только при наличии ios::out
Чтение происходит, а вот дозаписи в конец нет.

C++
1
2
3
4
5
6
7
fstream fs("test.txt", ios::in | ios::out | ios::app);
string s;
fs >> s;
cout << "Read string: " << s << endl
    << "Now let\'s write." << endl;
fs << "Ipsum" << "\n";
fs.close();
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.03.2012, 17:54     fstream не работает и чтение и запись #14
писал же тут почему так
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
17.03.2012, 18:14  [ТС]     fstream не работает и чтение и запись #15
retmas, спасибо. Вот это работает. Логика такая: если строка единственная и считана, то достигнут конец файла, нужно сделать clear(), то есть установить

iostate state = goodbit

Если конец не достигнут, то нужно для app поставить позицию в конец, без этого запись не идет.

C++
1
2
3
4
5
6
7
8
9
10
11
fstream fs("test.txt", ios::in | ios::out | ios::app);
string s;
fs >> s;
cout << "Read string: " << s << endl
<< "Now let\'s write." << endl;
 
if (fs.eof()) fs.clear();
else fs.seekp(ios_base::end);
 
fs << "\n" << "Ipsum" << "\n";
fs.close();
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.03.2012, 18:34     fstream не работает и чтение и запись #16
Цитата Сообщение от Red Planet Посмотреть сообщение
Если конец не достигнут, то нужно для app поставить позицию в конец, без этого запись не идет.
не правда. прочитай ещё раз, что такое app, и что при этом происходит.
вобщем, это лишнее:
Цитата Сообщение от Red Planet Посмотреть сообщение
else fs.seekp(ios_base::end);
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
17.03.2012, 23:03  [ТС]     fstream не работает и чтение и запись #17
Цитата Сообщение от retmas Посмотреть сообщение
не правда. прочитай ещё раз, что такое app, и что при этом происходит.
вобщем, это лишнее:
Знаю, что app ставит позицию в самый конец.

else fs.seekp(ios_base::end);
Отключал - запись перестала работать. Видно, что-то там сложнее.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.03.2012, 23:16     fstream не работает и чтение и запись #18
ничего там сложного нет. пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
    fstream fs("test.txt", ios::in | ios::out | ios::app);
    string s;
    
    fs >> s;
    cout << "Read string: " << s << endl
            << "Now let\'s write." << endl;
 
    if (fs.eof())
        fs.clear();
 
    fs << "Ipsum";
    fs.close();
    return 0;
}
изначально файла нет. первый запуск:
Read string:
Now let's write.
второй запуск:
Read string: Ipsum
Now let's write.
третий запуск:
Read string: IpsumIpsum
Now let's write.
и т.д.
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
25.03.2012, 11:57  [ТС]     fstream не работает и чтение и запись #19
retmas, этот код работает. Однако запись второй раз и далее идет безуспешно, если попытаться записать

C++
1
fs << "Ipsum" << "\n";
а не

C++
1
fs << "Ipsum";
Чтобы работало, я сделал fs.seekp(ios::end);

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 <vcl>
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
    string dont_modify = "## DON\'T MODIFY MANUALLY! ##";
    fstream fs("test.txt", ios::in | ios::out | ios::app);
           string s;
 
    fs >> s;
    cout << "Read string: " << s << endl
            << "Now let\'s write." << endl;
 
    if (fs.eof()) fs.clear();
    else fs.seekp(ios::end);
 
    fs << "Ipsum" << "\n";
    fs.close();
    system("pause");
    return 0;
 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2012, 12:57     fstream не работает и чтение и запись
Еще ссылки по теме:

C++ Чтение всего файла fstream
C++ Не работает метод класса (запись и чтение в файл)
Fstream - чтение из файла C++

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

Или воспользуйтесь поиском по форуму:
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
25.03.2012, 12:57     fstream не работает и чтение и запись #20
Цитата Сообщение от Red Planet Посмотреть сообщение
Однако запись второй раз и далее идет безуспешно
"не верю" (с)

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    fstream fs("test.txt", ios::in | ios::out | ios::app);
    string s;
 
    fs >> s;
    cout << "Read string: " << s << endl
            << "Now let\'s write." << endl;
 
    if (fs.eof()) fs.clear();
    //else fs.seekp(ios::end);
 
    fs << "Ipsum" << "\n";
    fs.close();
    return 0;
}
проверил. благополучно добавляет в конец

Добавлено через 3 минуты
после первого запуска в файле:
Ipsum
после второго:
Ipsum
Ipsum
после 3го:
Ipsum
Ipsum
Ipsum
и т.д.

могу только повторить. fs.seekp(ios::end); для записи - лишнее
Yandex
Объявления
25.03.2012, 12:57     fstream не работает и чтение и запись
Ответ Создать тему
Опции темы

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