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

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

Восстановить пароль Регистрация
 
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
04.10.2013, 22:19     что делать если ofstream не закрывает файл #1
Код:
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, чем еще можно записать( так же легко) данные?

Но лучше подскажите как же все таки закрыть этот файл?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.10.2013, 22:25     что делать если ofstream не закрывает файл #2
Цитата Сообщение от karaulov6 Посмотреть сообщение
unilog.close - не закрывает файл.
Как видите?
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
04.10.2013, 22:37  [ТС]     что делать если ofstream не закрывает файл #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();
                 }
файл теперь записан, но доступа на удаление и запись нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.10.2013, 23:01     что делать если ofstream не закрывает файл #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" выведет, то файл закрылся.
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
04.10.2013, 23:01  [ТС]     что делать если ofstream не закрывает файл #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
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2013, 00:13     что делать если ofstream не закрывает файл #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"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2013, 10:49     что делать если ofstream не закрывает файл
Еще ссылки по теме:

C++ string,switch, что делать, если требуется сравнение русского текста
C++ Что делать если нужно знести информацию в 2 разных объекта базового класса при закрытом наследование
Что делать, если хочется писать программы на заказ? C++

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

Или воспользуйтесь поиском по форуму:
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
05.10.2013, 10:49  [ТС]     что делать если ofstream не закрывает файл #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
Yandex
Объявления
05.10.2013, 10:49     что делать если ofstream не закрывает файл
Ответ Создать тему
Опции темы

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