Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 245
1

что делать если ofstream не закрывает файл

04.10.2013, 22:19. Показов 2530. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (NeedUnitLog)
                 {
                     NeedUnitLog = false;
                     ofstream unilog;
                     unilog.open("UnitLog.txt", ios::out);
                     unilog << "Список НОМЕР : ID юнитов" << endl;
                     for (DWORD i = 0x100000; i < 0x1E0000; i++)
                     {
                         if (GetUnitId(i) > 0)
                             unilog << i << "-ID:" << GetUnitId(i) << endl;
                     }
                     //unilog.flush();
                     unilog.close();
                 }
unilog.close - не закрывает файл. В коде где нет цикла, файл закрывается отлично.

Мне нужно записать в файл данные (старые данные стирать). Всегда записывал с помощью ofstream, чем еще можно записать( так же легко) данные?

Но лучше подскажите как же все таки закрыть этот файл?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2013, 22:19
Ответы с готовыми решениями:

Файловый ввод С++.Не создаётся файл ifstream что делать?Если что функцию is_open тоже пробовал не выходит
//Удаление Элемента из массива// #include&lt;fstream&gt; using std::ifstream; void...

Windows закрывает или прекращает работу программ, что делать?
Не могу открыть скайп, вылетают ошибки, не могу открыть стим - вылетает ошибка: Не знаю...

Что делать если ни один файл на компьютере не открывается ?
На компьютер попал вирус, пишет, что все файлы зашифрованы, и дешифратор можно получить только...

Что делать если ни один файл на компьютере не открывается ?
На компьютер попал вирус, пишет, что все файлы зашифрованы, и дешифратор можно получить только...

6
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
04.10.2013, 22:25 2
Цитата Сообщение от karaulov6 Посмотреть сообщение
unilog.close - не закрывает файл.
Как видите?
0
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 245
04.10.2013, 22:37  [ТС] 3
Ну в тоталкомандере отображается как 0 байт. Когда открываю в текстовом редакторе пишет что нет прав на запись и удаление, но содержимое отображается.

P.S код находится в таймере, и перед закрытием for.. очень много раз функцию GetUnitID вызывает. Что из этого может повлиять на закрытие файла?

Добавлено через 8 минут
так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (NeedUnitLog)
                 {
                     NeedUnitLog = false;
                     ofstream unilog;
                     unilog.open("UnitLog.txt", ofstream::out);
                     unilog << "Список НОМЕР : ID юнитов" << endl;
                     unilog.close();
                     for (DWORD i = 0x100000; i < 0x1E0000; i++)
                     {
                         unilog.open("UnitLog.txt", ofstream::out | ofstream::app);
                         if (GetUnitId(i) > 0)
                             unilog << i << "-ID:" << GetUnitId(i) << endl;
                         unilog.close();
                     }
                     unilog.close();
                 }
файл теперь записан, но доступа на удаление и запись нет.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
04.10.2013, 23:01 4
Цитата Сообщение от karaulov6 Посмотреть сообщение
Ну в тоталкомандере отображается как 0 байт. Когда открываю в текстовом редакторе пишет что нет прав на запись и удаление, но содержимое отображается.
P.S код находится в таймере, и перед закрытием for.. очень много раз функцию GetUnitID вызывает. Что из этого может повлиять на закрытие файла?
Ничего не понял, но закрытие файла можно так проверить:
C++
1
2
3
if (unilog.good()) cout << "good" << endl;
unilog.close();
if (!unilog.rdbuf() ->close()) cout << "close" << endl;
Если "good" и "close" выведет, то файл закрылся.
0
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 245
04.10.2013, 23:01  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (NeedUnitLog)
                 {
                     NeedUnitLog = false;
                     FILE * pFile;
                     fopen_s(&pFile, "UnitLog.txt", "w");
                     char endlinechar [] = { '\n', '\r' };
                     for (DWORD i = 0x100000; i < 0x1E0000; i++)
                     {
                         if (GetUnitId(i) > 0)
                         {
                             char * tmpchar = new char[256];
                             sprintf_s(tmpchar, 256, "%d-ID:%d", i, GetUnitId(i));
                             fwrite(tmpchar, sizeof(char) ,256, pFile);
                             fwrite(endlinechar, sizeof(char), 2, pFile);
                             delete [] tmpchar;
                         }
                     }
                     fclose(pFile);
                 }
Так тоже не закрылся файл, и еще пару кб левых записалось


Доступа нет что ли?

P.S программа не консоль, а dll
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2013, 00:13 6
Цитата Сообщение от karaulov6 Посмотреть сообщение
P.S программа не консоль, а dll
Тогда так:
C++
1
2
3
4
5
6
7
8
9
10
11
    ofstream ftest("test.txt");
    if (unilog.good()) 
    {
            ftest << "good" << endl;
            unilog.close();
            if (!unilog.rdbuf() ->close()) ftest << "close" << endl;
            else ftest << "no close" << endl;
    }
    else ftest << "bad" << endl;
    ftest.flush();
    ftest.close();
Добавлено через 10 минут
Вы, вообще, знаете: сколько времени занимает запись в файл "UnitLog.txt"?
0
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 245
05.10.2013, 10:49  [ТС] 7
Файл "test.txt" не появился. UnitLog.txt появился с пустым размером, после обновления F5 папки он стал правильного размера. Дескриптор не закрылся, доступа к файлу на удаление и редактирование нет.

Добавлено через 21 минуту
Как я и думал, если убрать

C++
1
2
3
4
5
6
7
8
for (DWORD i = 0x100000; i < 0x1E0000; i++)
    {
        if (GetUnitId(i) > 0)
        {
            unilog << i << "-ID:" << GetUnitId(i) << endl;
        }
    }
//После этого не работает ни одна функция. Даже просто MessageBox не появляется.
то все работает.

Добавлено через 21 минуту
C++
1
for (UINT i = 0x100000;i < 0x1E0000; i++)
если уменьшить до i < 0x100010 то работает все

что это за баг или какая-то защита от цикла бесконечного? Не могу понять.... Заменял на while(i < 0x1E0000) , такая же проблема. Придется разбивать на несколько циклов ?

Добавлено через 4 минуты
останавливается 1017FE, и это из-за функции GetUnitId

Добавлено через 11 минут
Все проблему решил, оказалось я нашел максимальное количество юнитов

6142
0
05.10.2013, 10:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2013, 10:49
Помогаю со студенческими работами здесь

Что делать, если не запускается ПК?
Стоял дома ПК, потом перенес его в другое здание, дома протер от пыли, на улице был мороз, тащил с...

Что делать в случае если
у меня вот такой вопрос от новичка конечно я извиняюсь что задал такой интригующий вопрос в топике...

Вычесление простейшего выражения. народ если несложно обьясните что я зделал здесь неправильно и наглядным образом чтобы я понял как что делать.
Нужно вычислить выражения 2*17/7-1708/17*1992. Пожалуйста, зарание благодарен. .386 . model...

Если нужна БД в облаке, то что делать?
Суть в сабже. Вопрос более теоретический, ибо не горит. Однако, если мне требуется работать над...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru