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

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

Войти
Регистрация
Восстановить пароль
 
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 241
Завершенные тесты: 2
#1

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

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

Код:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2013, 22:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос что делать если ofstream не закрывает файл (C++):

сообщение что исходный файл не откомпилирован что делать? - C++
Собственно скачал я dev c++ пишу простую программу #include &lt;iostream&gt; int main() { std::cout &lt;&lt; &quot;Hello world!&quot;; ...

что делать если выдает такую ошибку? - C++
--------------------Configuration: 5 - Win32 Debug-------------------- Compiling... 5.cpp h:\5\5\5.cpp(21) : fatal error C1010:...

Что делать если нет функции Tools - C++
А у меня нет функции Tool что делать?????

Что делать, если хочется писать программы на заказ? - C++
Хачю писать програми на заказ, посоветуйти мне што нибуть

Ребят Незнаю что делать при запуске на компилирование выдает ошибку.Кто понимает что не так скажите а если не затруднит исправьте ошибку - C++
Разговаривал с двумя преподами говорят что проект не правильно создавал,хотя все правильно из группы спрашивал у парней говорят что не...

Что делать если в зависимости от вводимых параметров код должен меняться? - C++
Итак имеется задача: В зависимости от вводимого N выводить на экран все возможные векторы длины от N до 1, при этом для каждой отдельной...

6
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.10.2013, 22:25 #2
Цитата Сообщение от karaulov6 Посмотреть сообщение
unilog.close - не закрывает файл.
Как видите?
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 241
Завершенные тесты: 2
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
alsav22
5426 / 4821 / 442
Регистрация: 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
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 241
Завершенные тесты: 2
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
alsav22
5426 / 4821 / 442
Регистрация: 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
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 241
Завершенные тесты: 2
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2013, 10:49
Привет! Вот еще темы с ответами:

string,switch, что делать, если требуется сравнение русского текста - C++
int main() { setlocale(LC_ALL, &quot;Russian&quot;); ofstream fout(FILENAME); string inner,math_count, rl = &quot;текст1&quot;; int ct = 19; ...

если первый элемент максимальный ответ не правильно выводить что делать мне - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; const int N = 3; using namespace std; void vvodMatr(int a) ; void poiskMax (int a,...

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

подскажите что делать при вводимых данных 10 25 и 5 20 программа работает не правильно должна выводить 135 подскажите что делать - C++
Вывод В выходной файл выведите одно число - сколько ударов сделали часы за этот отрезок времени.


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

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

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