Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Открываю существующий файл через CreateFile,как переместиться в конец? / 16 сообщений из 16, страница 1 из 1
24.02.2017, 20:32
    #39410038
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открываю существующий файл через CreateFile,как переместиться в конец?
Прога пишет 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
24.02.2017, 20:46
    #39410043
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открываю существующий файл через CreateFile,как переместиться в конец?
Догнал, вроде зафурычило.


Код: 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
24.02.2017, 20:51
    #39410048
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открываю существующий файл через CreateFile,как переместиться в конец?
Используй ф-ции стандартной библиотеки и будет тебе проще.
...
Рейтинг: 0 / 0
24.02.2017, 21:29
    #39410061
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открываю существующий файл через CreateFile,как переместиться в конец?
SiemarglИспользуй ф-ции стандартной библиотеки и будет тебе проще.
Ну, для меня API как раз проще, а вот C++ вещь не стандартная.
Тем более там "исходный код" уже сплошь API, зачем приплетать "ф-ции стандартной библиотеки".
...
Рейтинг: 0 / 0
24.02.2017, 22:34
    #39410076
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открываю существующий файл через CreateFile,как переместиться в конец?
Дмитрий77SiemarglИспользуй ф-ции стандартной библиотеки и будет тебе проще.
Ну, для меня API как раз проще, а вот C++ вещь не стандартная.
Тем более там "исходный код" уже сплошь API, зачем приплетать "ф-ции стандартной библиотеки".
С++ (точнее, это стандартная С-библиотека) как раз весьма стандартизованная.

Но вот, второе - это нормальный аргумент.
...
Рейтинг: 0 / 0
25.02.2017, 16:06
    #39410162
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открываю существующий файл через CreateFile,как переместиться в конец?
Дмитрий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
26.02.2017, 13:04
    #39410340
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открываю существующий файл через CreateFile,как переместиться в конец?
Пётр СедовВы log-файл пишете в кодировке UTF-16?

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


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

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

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

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

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

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

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

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

Исходники IBM это, ммм, типа образец такой, нетрадиционного мышления. Привел в пример как противовес
...
Рейтинг: 0 / 0
26.02.2017, 23:32
    #39410514
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открываю существующий файл через CreateFile,как переместиться в конец?
Пётр СедовДмитрий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
26.02.2017, 23:44
    #39410516
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открываю существующий файл через CreateFile,как переместиться в конец?
Дмитрий77здесь это так понимаю будет отдельная нетривиальная (и главное ничем не оправданная) задача.

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


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

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


Да.
Делается просто, через imbue.
...
Рейтинг: 0 / 0
27.02.2017, 21:47
    #39411248
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Открываю существующий файл через CreateFile,как переместиться в конец?
Дмитрий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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Открываю существующий файл через CreateFile,как переместиться в конец? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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