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

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

Восстановить пароль Регистрация
 
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 18:24     Открыть файл для ввода и вывода #1
Все привет. Есть код:
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++)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 18:28     Открыть файл для ввода и вывода #2
Ну вообще std::fstream::in | std::fstream::out.
И, самое главное:
The terminating null character is not inserted into os.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 18:35  [ТС]     Открыть файл для ввода и вывода #3
Цитата Сообщение от castaway Посмотреть сообщение
Ну вообще std::fstream::in | std::fstream::out.
С чего вдруг? Какая разница? Это определено в ios_base и наследовано в fstream.
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 18:37     Открыть файл для ввода и вывода #4
Цитата Сообщение от Dani Посмотреть сообщение
С чего вдруг? Какая разница?
Не суть важно. До конца дочитай, мне почему-то кажется что проблема именно в том, что:
Цитата Сообщение от castaway Посмотреть сообщение
The terminating null character is not inserted into os.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 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';
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 18:50     Открыть файл для ввода и вывода #6
А что в файле получается?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 18:51  [ТС]     Открыть файл для ввода и вывода #7
castaway, тот же файл. Без изменений.
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 19:05     Открыть файл для ввода и вывода #8
Тут похоже вот в чем дело.. стандартные потоки не поддерживают string, только c-string.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 19:10  [ТС]     Открыть файл для ввода и вывода #9
castaway, нет, для класса string перегружены операторы << и >>, которые юзают операторы ввода для c-string.
Schizorb
 Аватар для Schizorb
508 / 460 / 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 так работает.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 19:28  [ТС]     Открыть файл для ввода и вывода #11
Schizorb, это да, если файл очистить. А если сделать ввод из непустого файла? И сделать запись туда же.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
06.08.2013, 19:30     Открыть файл для ввода и вывода #12
Dani, так я для этого std::fstream::trunc и добавил.
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 19:32     Открыть файл для ввода и вывода #13
Schizorb, у потоков ввода и вывода разные файловые указатели.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 19:37  [ТС]     Открыть файл для ввода и вывода #14
Хм... добавил file.seekp(0) - как-то работает. Был файл
Вот такой был
Код
ABC
DEF
GHI
JKL


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


Добавлено через 1 минуту
Без seekg - файл таким же и остается
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
06.08.2013, 19:39     Открыть файл для ввода и вывода #15
Цитата Сообщение от castaway Посмотреть сообщение
Schizorb, у потоков ввода и вывода разные файловые указатели.
Это вы к чему? Я seekg некорректно использую?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.08.2013, 19:40  [ТС]     Открыть файл для ввода и вывода #16
Цитата Сообщение от Schizorb Посмотреть сообщение
Это вы к чему? Я seekg некорректно использую?
Это он к тому, что указатель позиции для ввода - seekg (от слова seek-get), а для вывода - seekp (от слова seek-put)
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 19:41     Открыть файл для ввода и вывода #17
Цитата Сообщение от Schizorb Посмотреть сообщение
Это вы к чему?
К тому, что после ввода в файл строки "Hello!", файловый указатель вывода измениться не должен.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
06.08.2013, 19:47     Открыть файл для ввода и вывода #18
castaway, в том и дело, что меняется:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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;
    std::cout << file.tellp() << " " << file.tellg() << "\n";
    file << "Hello!";
    std::cout << file.tellp() << " " << file.tellg() << "\n";
    file.seekg(0);
    file >> s;
    std::cout << "Entered: " << s;
    return 0;
}
Миниатюры
Открыть файл для ввода и вывода  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2013, 19:56     Открыть файл для ввода и вывода
Еще ссылки по теме:

Переопределение ввода вывода для классов C++
C++ Создайте программу для ввода и вывода фамилий и оценок студентов
Файлы для ввода/вывода C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
06.08.2013, 19:56     Открыть файл для ввода и вывода #19
Да, действительно, меняются оба... Так у меня работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fstream>
#include <iostream>
 
int main() {
    std::fstream fs( "test.txt", std::fstream::in | std::fstream::out | std::fstream::app );
    std::string s;
 
    fs << "test";
    fs.seekp( 0 );
    fs >> s;
    std::cout << s;
 
    fs.close();
    return 0;
}
Yandex
Объявления
06.08.2013, 19:56     Открыть файл для ввода и вывода
Ответ Создать тему
Опции темы

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