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

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

Войти
Регистрация
Восстановить пароль
 
 
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
#1

Открыть файл для ввода и вывода - C++

06.08.2013, 18:24. Просмотров 650. Ответов 18
Метки нет (Все метки)

Все привет. Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <fstream>
#include <string>
 
int main()
{
    std::fstream file("output_data.txt", std::ios_base::in | std::ios_base::out);
    std::string s;
    file << "Hello!";
    file >> s;
    std::cout << "Entered: " << s;
    return 0;
}
Как вы могли заметить, файл открывается одновременно для ввода и для вывода. При запуске в MSVS 2012, в файл либо записывается различный мусор, либо считывается из него какой-то мусор(этого мусора в файле нету). При запуске в g++ 4.7 все работает на ура: и ввод и вывод.

Что за странное поведение? С чем оно связано?

Добавлено через 9 минут
Хотя, нет - вру. Оно половину данных стирает в файле и записывает (g++)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2013, 18:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Открыть файл для ввода и вывода (C++):

Ошибки в программе ввода информации в файл и вывода - C++
Собственно, программа #include &lt;stdio.h&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #define LINE &quot;\n...

Потоки ввода/вывода: дважды скопировать исходный файл - C++
Когда пытаюсь побайтно копировать из одного файла в другой - всё работает. А вот если попытаться ДВА раза скопировать исходный файл , то...

Ошибка при работе с потоками ввода (вывода) в файл (из файла) - C++
Изучаю перегрузку операторов ввода/вывода с файлом и без. Вылетает такая ошибка при отработанном коде: Необработанное исключение по...

Потоки ввода/вывода. Сохранение информации в файл и ее считывание оттуда - C++
Всем доброго времени суток. Неделю две назад я начал делать программу, которая бы сохраняла информацию о так называемых фирмах в текстовом...

Файлы для ввода/вывода - C++
Посчитайте A + B. Технические условия Входные данные В каждой строке задано два целых числа A и B (|A|, |B| ≤ 30000)....

Операторы ввода/вывода для чайников - C++
Как думаете если использовать оператор ввода или вывода cout или cin это не покажется что человек чайник??? И еще вы обычно какими...

18
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 18:28 #2
Ну вообще std::fstream::in | std::fstream::out.
И, самое главное:
The terminating null character is not inserted into os.
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 18:35  [ТС] #3
Цитата Сообщение от castaway Посмотреть сообщение
Ну вообще std::fstream::in | std::fstream::out.
С чего вдруг? Какая разница? Это определено в ios_base и наследовано в fstream.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 18:37 #4
Цитата Сообщение от Dani Посмотреть сообщение
С чего вдруг? Какая разница?
Не суть важно. До конца дочитай, мне почему-то кажется что проблема именно в том, что:
Цитата Сообщение от castaway Посмотреть сообщение
The terminating null character is not inserted into os.
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 18:41  [ТС] #5
Цитата Сообщение от castaway Посмотреть сообщение
The terminating null character is not inserted into os.
Добавил так null-character, но не помогло - операция вывода MSVS опять не сработала - только ввод.
C++
1
file << "Hello!" << '\0';
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 18:50 #6
А что в файле получается?
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 18:51  [ТС] #7
castaway, тот же файл. Без изменений.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 19:05 #8
Тут похоже вот в чем дело.. стандартные потоки не поддерживают string, только c-string.
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 19:10  [ТС] #9
castaway, нет, для класса string перегружены операторы << и >>, которые юзают операторы ввода для c-string.
0
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
06.08.2013, 19:24 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
#include <string>
 
int main()
{
    std::fstream file("output_data.txt", std::fstream::in | std::fstream::out | std::fstream::trunc);
    std::string s;
    file << "Hello!";
    file.seekg(0);
    file >> s;
    std::cout << "Entered: " << s;
    return 0;
}
В gcc так работает.
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 19:28  [ТС] #11
Schizorb, это да, если файл очистить. А если сделать ввод из непустого файла? И сделать запись туда же.
0
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
06.08.2013, 19:30 #12
Dani, так я для этого std::fstream::trunc и добавил.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 19:32 #13
Schizorb, у потоков ввода и вывода разные файловые указатели.
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 19:37  [ТС] #14
Хм... добавил file.seekp(0) - как-то работает. Был файл
Вот такой был
Код
ABC
DEF
GHI
JKL


А стал файл таким:
Стал файл таким
Код
Hello!EF
GHI
JKL


Добавлено через 1 минуту
Без seekg - файл таким же и остается
0
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
06.08.2013, 19:39 #15
Цитата Сообщение от castaway Посмотреть сообщение
Schizorb, у потоков ввода и вывода разные файловые указатели.
Это вы к чему? Я seekg некорректно использую?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2013, 19:39
Привет! Вот еще темы с ответами:

Переопределение ввода вывода для классов - C++
#include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &lt;clocale&gt; #include &lt;iomanip&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include...

Исчезает окно для ввода и вывода - C++
:cry: пишу программу в Win32.программа компилируется,а после черное окошко для ввода и вывода появляется и тут же исчезает!как это...

Формат ввода вывода для дат - C++
Здорова!!! Есть задачка: &quot;Поэкспериментируйте и определите, какие форматы ввода/вывода использует ваша система для дат.&quot; И как же...

Исправить код для ввода и вывода матрицы - C++
НАписал код для ввода и вывода матрицы. Выдает ошибку без лога. #include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;conio.h&gt; ...


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

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

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