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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.97
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
#1

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

17.03.2012, 12:51. Просмотров 5659. Ответов 25
Метки нет (Все метки)

Добрый день! Не пойму, почему введение функции 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");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2012, 12:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос fstream не работает и чтение и запись (C++):

Запись/чтение структуры через fstream - C++
Доброго времени суток! у меня есть несколько вопросов по поводу файловых потоков. 1. Как можно записать/прочитать массив структур в...

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

Чтение/запись битового файла (не работает) - C++
Программа по идее должна записывать/читать битовый файл, но она даже его не создаёт. ...

Fstream - чтение из файла - C++
подскажите начинающему программисту как читать файл целиком.. например последовательность чисел

Не работает метод класса (запись и чтение в файл) - C++
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; using namespace std; class Lines { private: char *line;

Чтение всего файла fstream - C++
В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку, но почему-то я не нашёл ничего готового (типа...

25
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
17.03.2012, 18:34 #16
Цитата Сообщение от Red Planet Посмотреть сообщение
Если конец не достигнут, то нужно для app поставить позицию в конец, без этого запись не идет.
не правда. прочитай ещё раз, что такое app, и что при этом происходит.
вобщем, это лишнее:
Цитата Сообщение от Red Planet Посмотреть сообщение
else fs.seekp(ios_base::end);
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
17.03.2012, 23:03  [ТС] #17
Цитата Сообщение от retmas Посмотреть сообщение
не правда. прочитай ещё раз, что такое app, и что при этом происходит.
вобщем, это лишнее:
Знаю, что app ставит позицию в самый конец.

else fs.seekp(ios_base::end);
Отключал - запись перестала работать. Видно, что-то там сложнее.
0
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
17.03.2012, 23:16 #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.
и т.д.
1
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
25.03.2012, 11:57  [ТС] #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;
 
}
0
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
25.03.2012, 12:57 #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); для записи - лишнее
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 292
Регистрация: 10.12.2010
Сообщений: 23,945
Записей в блоге: 17
25.03.2012, 15:05 #21
Сталкивался с такой проблемой надо устанавливать позицию курсора при смене чтение/запись
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
25.03.2012, 18:28  [ТС] #22
Цитата Сообщение от retmas Посмотреть сообщение
"не верю" (с)

могу только повторить. fs.seekp(ios::end); для записи - лишнее
retmas, а IDE у вас какая? Я пробовал на C++Builder 2010 и на Microsoft Visual C++ 2010 Express, но и на одной, и на другой требовалось

C++
1
fs.seekp(ios::end);
Цитата Сообщение от Avazart Посмотреть сообщение
Сталкивался с такой проблемой надо устанавливать позицию курсора при смене чтение/запись
Запомню.
0
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
25.03.2012, 19:51 #23
борландом не пользуюсь. visual ведет себя как положено, так же ведут себя и gcc и интеловский компиль. раньше был еще dmc с стл портом. и насколько я помню стл порт тоже вел себя как подобается.
незнаю, но полагаю борланд тоже ведет себя стандартно, просто вы где-то ошиблись/недосмотрели, а может не видите очевидного "слона". такое бывает часто со всеми
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 292
Регистрация: 10.12.2010
Сообщений: 23,945
Записей в блоге: 17
25.03.2012, 20:45 #24
И тем не менее другого решения я видел, да и сам его нашел методом тыка
0
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
25.03.2012, 23:40 #25
Цитата Сообщение от Avazart Посмотреть сообщение
Сталкивался с такой проблемой надо устанавливать позицию курсора при смене чтение/запись
Вы очевидно путаете с режимом ios::ate. Для ios::app при записи укатель должен автоматически перемещаться в конец файла.
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 292
Регистрация: 10.12.2010
Сообщений: 23,945
Записей в блоге: 17
25.03.2012, 23:59 #26
Нет ничуть, я говорю про одновременное чтение и запись в файл используя fstream

Если не ошибаюсь то так
C++
1
fs.seekp(fs.tellg());
0
25.03.2012, 23:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2012, 23:59
Привет! Вот еще темы с ответами:

Заменить чтение из файла аналогом fstream - C++
char fileName; printf(&quot;Enter file name: &quot;); scanf(&quot;%255s&quot;, fileName); FILE *open = fopen(fileName, &quot;r&quot;); ...

Чтение файла в массив символов используя fstream - C++
Добрый день. Нужно считать файл в массив символов(vector). Использую fstream.

Запись в файл fstream - C++
Вот такой вот код , изобразил я для записи переменной в файл , проблема в том , что компилятор записывает в него не 10 раз L , а ...

Запись в файл fstream - C++
После первого прогона не выводит ничего из файла. void WriteInTheFile(fstream &amp;file_in) { file_in.seekg(0,file_in.end); char str;...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

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