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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
#1

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

22.01.2012, 19:21. Просмотров 1068. Ответов 12
Метки нет (Все метки)

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

Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2012, 19:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос fstream в многопроцессной среде (C++):

fstream - C++
помогите, пожалуйста, чет я совсем запуталась((( /*Дан текстовый фал, содержащий целые числа, разделенные пробелами. Определить...

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

fstream - C++
Дан текстовый файл. Осуществить посимвольную чередующуюся печать файла в прямом и обратном направлении в новый файл. Например, если в файле...

fstream и for - C++
Здрасте. Собственно, не могу понять, по какой причине не работает вот такой вот код, хотя по идее должен работать, или я ошибаюсь? ...

<fstream> - C++
как читать из файла и записывать переменные написанные через пробел используя ifstream in(&quot;int.txt&quot;); ofstream...

fstream - C++
Всем доброго дня! Как с помощью библиотеки fstream вывести содержимое файла на экран??

12
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.01.2012, 19:26 #2
fstream.
0
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 19:32  [ТС] #3
Цитата Сообщение от soon Посмотреть сообщение
Касательно #5 fstream.
Я спрашиваю именно потому, что там ничего про это не написано. Ну не написано там что делает ifstream io(".\\tmp.txt") если другой тред(или процесс, не важно) уже сделал ofstream(".\\tmp.txt"). Там написаны случаи только если файла нет/ошибка в исполнении(какая именно? - не указано.)
0
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
22.01.2012, 19:41 #4
а что вас смущает? создадутся 2 разных стрима, которые будут работать с 1м файлом.
1
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 19:53  [ТС] #5
Одновременно писать и читать не возможно, любой это знает.
Меня смущает, что когда я открыл ifstream и ofstream в одном треде одновременно, то ifstream файл нормально открывает, но при чтении выдает badbit. Даже если ofstream ничего не делает. Но это нигде не оговорено. А что будет если два треда? То же самое или нет? И есть ли гарантия этого? С двумя тредами проверять сложнее.
Открытие файла через winapi же просто выдает эксепшн(если я правильно помню) - поведение значительно разное.
Плюс вопрос 5 мне очень важен. Я так и не нашел этого в мануалах.
0
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
22.01.2012, 20:01 #6
Цитата Сообщение от Teravisor Посмотреть сообщение
ifstream файл нормально открывает, но при чтении выдает badbit
а eofbit при этом установлен? если да, то причем тут есть ofstream или нет
1
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 20:01  [ТС] #7
Нет конечно, не установлен.
0
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
22.01.2012, 20:08 #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;
}
ну так проверьте, будет ли выброшено исключение
1
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 20:14  [ТС] #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;
}
ну так проверьте, будет ли выброшено исключение
А тут исключения нет. Ничего не понимаю...
0
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
22.01.2012, 20:15 #10
Цитата Сообщение от Teravisor Посмотреть сообщение
ofstream of(".\\tmp",ios::out|ios::in);
вы хоть думаете, что пишите?
дальше не смотрел
1
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
22.01.2012, 20:20  [ТС] #11
Цитата Сообщение от retmas Посмотреть сообщение
вы хоть думаете, что пишите?
Извиняюсь, это была очередная моя попытка. без флагов то же самое.
А нет, поправляюсь. Если мы пытаемся в этот момент обрезать файл, то винда выдает ошибку 183 - т.е. файл нельзя обрезать. А в приведенном коде ios::in обозначает, что обрезать нельзя. можно заменить на ios::app, без разницы.

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

fail1 возникает из-за int a, при замене на char a работает. Однако раньше возникало постоянно. Загадка...
Зато появилась загадка - почему в ios::app винда ругается, что мы путаемся стереть файл. Но спасибо за помощь в исправлении моей криворукости и моих заблуждений.
0
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
22.01.2012, 20:26 #12
вот здесь
Цитата Сообщение от Teravisor Посмотреть сообщение
in>>a;
вы сами приводите стрим в состояние фейл(подумайте почему) и наличие другого стрима не важно
1
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.01.2012, 20:30 #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;
}
Это хотели?
0
22.01.2012, 20:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2012, 20:30
Привет! Вот еще темы с ответами:

Из fstream в cstdio - C++
Всем привет. Стоит задача: Написать программу, которая считывает текст из файла и записывает в другой файл только те предложения, которые...

не найден fstream.h ..... - C++
#include &lt;iostream&gt; #include &lt;fstream.h&gt; #include &quot;int.h&quot; using namespace std; fatal error C1083: Cannot open include file:...

траблы с fstream - C++
Всем привет! Начинаю работать над дз по проге и никак не могу разобраться с одной фишкой с fstream. Вот мои код: #include &quot;stdafx.h&quot; ...

Fstream и malloc_assert - C++
Подскажите пожалуйста, а то уже голова болит. Есть программа которая предоставляет выбор алгоритма обработки. Данные она берет из файлов...


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

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

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