powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Открываю существующий файл через CreateFile,как переместиться в конец?
16 сообщений из 16, страница 1 из 1
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410038
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прога пишет log-файл.
Исходный код открытия файла:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
                  // Create the new log file
                  g_hLogFile = CreateFile(szLoggingFilename,
                    GENERIC_WRITE,
                    FILE_SHARE_READ,
                    NULL,
                    CREATE_ALWAYS,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);
                  if (g_hLogFile == INVALID_HANDLE_VALUE) {
                    goto Exit;
                  }

                  // Write the Unicode BOM to the log file
                  WriteFile(g_hLogFile,
                    &cUnicodeBOM,
                    sizeof(WCHAR),
                    &dwSize,
                    NULL);
                  bRetVal = TRUE;



Я решил добавить опцию bClearAtStartup
Если TRUE - пишем новый (исходный вариант кода), если FALSE -дописываем существующий, если присутствует (ну и BOM тогда не пишем)
Ну, чуть переделал код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
               if (bClearAtStartup == TRUE)
                {
                  // Create the new log file
                  g_hLogFile = CreateFile(szLoggingFilename,
                    GENERIC_WRITE,
                    FILE_SHARE_READ,
                    NULL,
                    CREATE_ALWAYS,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);
                  if (g_hLogFile == INVALID_HANDLE_VALUE) {
                    goto Exit;
                  }

                  // Write the Unicode BOM to the log file
                  WriteFile(g_hLogFile,
                    &cUnicodeBOM,
                    sizeof(WCHAR),
                    &dwSize,
                    NULL);
                  bRetVal = TRUE;
                }
                else {
                  // Create the new log file if only exists, otherwise opens an existing file
                  g_hLogFile = CreateFile(szLoggingFilename,
                    GENERIC_WRITE,
                    FILE_SHARE_READ,
                    NULL,
                    OPEN_ALWAYS, // если файл существует, то не перезаписываем
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);
                  if (g_hLogFile == INVALID_HANDLE_VALUE) {
                    goto Exit;
                  }

                  if (GetLastError() != ERROR_ALREADY_EXISTS) {
                    // Write the Unicode BOM to the log file if only just created
                    WriteFile(g_hLogFile,
                      &cUnicodeBOM,
                      sizeof(WCHAR),
                      &dwSize,
                      NULL);
                  }
                  bRetVal = TRUE;
                }



Только он зараза начинает писать с нулевой позиции, поверх.
Оно меня как бы не удивляет.
Как мне в этой кухне в конец файла переместиться?
Ну я понимаю что это надо сделать.
Только вот с ходу не догоняю как.
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410043
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Догнал, вроде зафурычило.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
                else {
                  // Create the new log file if only exists, otherwise opens an existing file
                  g_hLogFile = CreateFile(szLoggingFilename,
                    GENERIC_WRITE,
                    FILE_SHARE_READ,
                    NULL,
                    OPEN_ALWAYS, // если файл существует, то не перезаписываем
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);
                  if (g_hLogFile == INVALID_HANDLE_VALUE) {
                    goto Exit;
                  }

                  if (GetLastError() != ERROR_ALREADY_EXISTS) {
                    // Write the Unicode BOM to the log file if only just created
                    WriteFile(g_hLogFile,
                      &cUnicodeBOM,
                      sizeof(WCHAR),
                      &dwSize,
                      NULL);
                  }
                  else {
                    SetFilePointer(g_hLogFile, 0, NULL, FILE_END);
                  }
                  bRetVal = TRUE;
                }
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410048
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй ф-ции стандартной библиотеки и будет тебе проще.
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410061
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglИспользуй ф-ции стандартной библиотеки и будет тебе проще.
Ну, для меня API как раз проще, а вот C++ вещь не стандартная.
Тем более там "исходный код" уже сплошь API, зачем приплетать "ф-ции стандартной библиотеки".
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410076
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77SiemarglИспользуй ф-ции стандартной библиотеки и будет тебе проще.
Ну, для меня API как раз проще, а вот C++ вещь не стандартная.
Тем более там "исходный код" уже сплошь API, зачем приплетать "ф-ции стандартной библиотеки".
С++ (точнее, это стандартная С-библиотека) как раз весьма стандартизованная.

Но вот, второе - это нормальный аргумент.
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410162
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77
Код: plaintext
1.
2.
3.
4.
5.
6.
                  // Write the Unicode BOM to the log file
                  WriteFile(g_hLogFile,
                    &cUnicodeBOM,
                    sizeof(WCHAR),
                    &dwSize,
                    NULL);

Вы log-файл пишете в кодировке UTF-16?
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410340
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовВы log-файл пишете в кодировке UTF-16?

Ну, получается да.
Код: plaintext
1.
2.
       // cUnicodeBOM is the Unicode BOM
        WCHAR  cUnicodeBOM = 0xFEFF;


Я ничего плохого в этом не вижу.
Это пример из Microsoft SDK (FSP провайдер под Microsoft Fax), который я переделываю под нужды своего приложения.
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410467
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Пётр СедовВы log-файл пишете в кодировке UTF-16?

Ну, получается да.А я бы писал log-файл в кодировке UTF-8.

Дмитрий77Я ничего плохого в этом не вижу.Если в log-файле в основном английский текст, то UTF-8 в 2 раза экономнее, чем UTF-16. Это существенно, если log-файл большой.

Дмитрий77Это пример из Microsoft SDK (FSP провайдер под Microsoft Fax),Microsoft-овский код -- это не образец для подражания.
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410471
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,

>Microsoft-овский код -- это не образец для подражания.
Примеры рерайта ?

Кстати, IBM-овский код видел?
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410494
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl>Microsoft-овский код -- это не образец для подражания.
Примеры рерайта ?Примеры чего?

SiemarglКстати, IBM-овский код видел?Нет. А причём здесь IBM-овский код?
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410501
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,

рерайт - это переписывание исходников, как было и как стало.

Исходники IBM это, ммм, типа образец такой, нетрадиционного мышления. Привел в пример как противовес
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410514
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовДмитрий77Это пример из Microsoft SDK (FSP провайдер под Microsoft Fax),Microsoft-овский код -- это не образец для подражания.
В данном конкретном случае MS жестко диктует что и как писать.
Using the Fax Service Provider API
И одно из требований: dll C(++) должна быть скомпилирована в Unicode.
Пример из SDK оказался весьма неплох, я его попросту переделал под готовую систему и получил работоспособное чего надо (при моих весьма слабых познаниях в C/C++).
И я так понимаю что если библиотека в Unicode, то и лог-файл проще писать тупо в Unicode.
Перекодировками содержимого заниматься?
Это в .Net куча всяких Text.Encoder, а здесь это так понимаю будет отдельная нетривиальная (и главное ничем не оправданная) задача.
В VB.Net я пишу логи в UTF8.
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410516
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77здесь это так понимаю будет отдельная нетривиальная (и главное ничем не оправданная) задача.

Вызов одной функции для тебя "нетривиальная задача"? Ню-ню...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410536
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дим, я с этим не разбирался.
Мне это не интересно и лог в Юникоде меня устраивает.
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39410572
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77И одно из требований: dll C(++) должна быть скомпилирована в Unicode.
Пример из SDK оказался весьма неплох, я его попросту переделал под готовую систему и получил работоспособное чего надо (при моих весьма слабых познаниях в C/C++).
И я так понимаю что если библиотека в Unicode, то и лог-файл проще писать тупо в Unicode.


Как модуль скомпилирован вовсе не диктует то, как записывать в лог-файл, в какой кодировке.

Дмитрий77Перекодировками содержимого заниматься?


Да.
Делается просто, через imbue.
...
Рейтинг: 0 / 0
Открываю существующий файл через CreateFile,как переместиться в конец?
    #39411248
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77В данном конкретном случае MS жестко диктуетОни это любят.

Дмитрий77Перекодировками содержимого заниматься?Да. Преобразование UTF-16 → UTF-8 легко сделать с помощью WinAPI:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
char* utf8_from_utf16(const WCHAR text[]) {
  int len8 = WideCharToMultiByte(CP_UTF8, 0, text, -1, NULL, 0, NULL, NULL);
  char* result = new char[len8]; // len8 включает завершающий нулевой char ('\0')
  WideCharToMultiByte(CP_UTF8, 0, text, -1, result, len8, NULL, NULL);
  return result;
}

// пишет в log-файл строку в кодировке UTF-8
void log(const char text[]) {
  assert(_log_file != NULL);
  size_t len = strlen(text);
  if (len != 0) {
    DWORD count;
    WriteFile(_log_file, text, len, &count, NULL);
  }
}

void log(const WCHAR text[]) {
  char* t8 = utf8_from_utf16(text);
  log(t8);
  delete[] t8;
}
...
  // при создании log-файла:
  log("\xef\xbb\xbf"); // пишем BOM

Обработку ошибок не писал, чтобы код был проще.

Дмитрий77В VB.Net я пишу логи в UTF8.Ну и правильно.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Открываю существующий файл через CreateFile,как переместиться в конец?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]