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

fstream в многопроцессной среде - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 19:21     fstream в многопроцессной среде #1
Не нашел в гугле ответа на следующие вопросы:
1. Что происходит когда ifstream открывает, затем читает существующий, но уже открытый на запись файл? Какие биты(badbit, failbit, eofbit) при этом устанавливаются после какого действия?
2. Аналогично - что происходит если ofstream это делает когда файл открыт на запись?
3. Выставляет ли ofstream биты если он открывает и пишет в файл, открытый до этого на чтение?
4. Успешны ли операции в пунктах 1-3? (записано ли/прочитано ли)
5. Возможно ли проверить открыт ли файл уже кем-то на чтение/запись с помощью fstream?

Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2012, 19:21     fstream в многопроцессной среде
Посмотрите здесь:

FStream C++
C++ fstream с++
C++ fstream
C++ fstream
<fstream> C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.01.2012, 19:26     fstream в многопроцессной среде #2
fstream.
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 19:32  [ТС]     fstream в многопроцессной среде #3
Цитата Сообщение от soon Посмотреть сообщение
Касательно #5 fstream.
Я спрашиваю именно потому, что там ничего про это не написано. Ну не написано там что делает ifstream io(".\\tmp.txt") если другой тред(или процесс, не важно) уже сделал ofstream(".\\tmp.txt"). Там написаны случаи только если файла нет/ошибка в исполнении(какая именно? - не указано.)
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
22.01.2012, 19:41     fstream в многопроцессной среде #4
а что вас смущает? создадутся 2 разных стрима, которые будут работать с 1м файлом.
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 19:53  [ТС]     fstream в многопроцессной среде #5
Одновременно писать и читать не возможно, любой это знает.
Меня смущает, что когда я открыл ifstream и ofstream в одном треде одновременно, то ifstream файл нормально открывает, но при чтении выдает badbit. Даже если ofstream ничего не делает. Но это нигде не оговорено. А что будет если два треда? То же самое или нет? И есть ли гарантия этого? С двумя тредами проверять сложнее.
Открытие файла через winapi же просто выдает эксепшн(если я правильно помню) - поведение значительно разное.
Плюс вопрос 5 мне очень важен. Я так и не нашел этого в мануалах.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
22.01.2012, 20:01     fstream в многопроцессной среде #6
Цитата Сообщение от Teravisor Посмотреть сообщение
ifstream файл нормально открывает, но при чтении выдает badbit
а eofbit при этом установлен? если да, то причем тут есть ofstream или нет
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 20:01  [ТС]     fstream в многопроцессной среде #7
Нет конечно, не установлен.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
22.01.2012, 20:08     fstream в многопроцессной среде #8
Цитата Сообщение от Teravisor Посмотреть сообщение
Одновременно писать и читать не возможно, любой это знает.
ошибаетесь

Добавлено через 6 минут
если я вас правильно понял, то вы хотите сказать, что тут будет failbit
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main ()
{
    ofstream f1("1.txt");
    ifstream f2("1.txt");
 
    f1.exceptions(ios::failbit);
    f2.exceptions(ios::failbit);
 
    f1 << "oggu" << endl;
 
    string s;
    f2 >> s;
 
    f1.close();
    f2.close();
 
    cout << s << endl;
    return 0;
}
ну так проверьте, будет ли выброшено исключение
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 20:14  [ТС]     fstream в многопроцессной среде #9
более конкретно Windows код(используется функция Sleep):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int _tmain(int argc, char** argv)
{
        ifstream in(".\\tmp");
    ofstream of(".\\tmp",ios::out|ios::in);
    of<<"abcdef";
    int a;//пробовал и char, выдает крякозябру.
    of.close();
    in>>a;
    printf("%d\n",GetLastError());
    if(in.bad())printf("bad1\n");
    if(of.bad())printf("bad2\n");
    if(in.fail())printf("fail1\n");
    if(of.fail())printf("fail2\n");
    if(in.eof())printf("eof1\n");
    if(of.eof())printf("eof2\n");
        Sleep(2000);
}
Выдает fail1. Файл tmp существует с прошлых попыток, его содержимое "abcdef", но при чтении в этом коде ошибка. printf("%d\n",GetLastError()); в любом месте выдает 0, т.е. винда ошибки не регестрирует.

Добавлено через 1 минуту
Цитата Сообщение от retmas Посмотреть сообщение
ошибаетесь

Добавлено через 6 минут
если я вас правильно понял, то вы хотите сказать, что тут будет failbit
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main ()
{
    ofstream f1("1.txt");
    ifstream f2("1.txt");
 
    f1.exceptions(ios::failbit);
    f2.exceptions(ios::failbit);
 
    f1 << "oggu" << endl;
 
    string s;
    f2 >> s;
 
    f1.close();
    f2.close();
 
    cout << s << endl;
    return 0;
}
ну так проверьте, будет ли выброшено исключение
А тут исключения нет. Ничего не понимаю...
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
22.01.2012, 20:15     fstream в многопроцессной среде #10
Цитата Сообщение от Teravisor Посмотреть сообщение
ofstream of(".\\tmp",ios::out|ios::in);
вы хоть думаете, что пишите?
дальше не смотрел
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 20:20  [ТС]     fstream в многопроцессной среде #11
Цитата Сообщение от retmas Посмотреть сообщение
вы хоть думаете, что пишите?
Извиняюсь, это была очередная моя попытка. без флагов то же самое.
А нет, поправляюсь. Если мы пытаемся в этот момент обрезать файл, то винда выдает ошибку 183 - т.е. файл нельзя обрезать. А в приведенном коде ios::in обозначает, что обрезать нельзя. можно заменить на ios::app, без разницы.

Добавлено через 4 минуты
Странно, заменил на ios::app, оно все равно ругается кодом 183(вот это загадка...). При этом сам стрим не сообщает никаких ошибок. Но продолжает давать мне fail1

fail1 возникает из-за int a, при замене на char a работает. Однако раньше возникало постоянно. Загадка...
Зато появилась загадка - почему в ios::app винда ругается, что мы путаемся стереть файл. Но спасибо за помощь в исправлении моей криворукости и моих заблуждений.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
22.01.2012, 20:26     fstream в многопроцессной среде #12
вот здесь
Цитата Сообщение от Teravisor Посмотреть сообщение
in>>a;
вы сами приводите стрим в состояние фейл(подумайте почему) и наличие другого стрима не важно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2012, 20:30     fstream в многопроцессной среде
Еще ссылки по теме:

C++ fstream
fstream и for C++
C++ Fstream в классах

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

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.01.2012, 20:30     fstream в многопроцессной среде #13
Teravisor, смотрите
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fstream>
#include <string>
#include <iostream>
 
int main()
{
    std::ifstream fin("tmp");
    std::ofstream fout("tmp");
    fout << "adasdawdawdawdawd";
    fout.seekp(0.);
    std::string s;
    fin >> s;
    std::cout << fout.fail() << fin.fail() << s << std::endl;
    return 0;
}
Это хотели?
Yandex
Объявления
22.01.2012, 20:30     fstream в многопроцессной среде
Ответ Создать тему
Опции темы

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