Как добавить данные в текстовый файл в C? - PullRequest
0 голосов
/ 24 апреля 2020

в программе C Я хочу добавить данные в текстовый файл. Использовал функцию fopen следующим образом:

FILE* fileLog;
char logFile_name[] = "C:\\pg\\log.txt";
fileLog = fopen(logFile_name, "r+");
int j = 0;
while (j < 4)
{
    fprintf(fileLog, "%u,%s", GetLastError(), "1_aba_1\n");
    j++;
}

GetLastError иногда возвращает (нормально), но файл перезаписывается и не добавляется.

Используется функция fopen следующим образом:

FILE* fileLog;
char logFile_name[] = "C:\\pg\\log.txt";
fileLog = fopen(logFile_name, "a+");
std::cout << GetLastError() << " LOG \n";

int j = 0;
while (j < 3)
{
    fprintf(fileLog, "%u,%s", GetLastError(), "56_aba_4\n");
    j++;
}

Данные добавлены, но GetLastError выдает ошибку 183. Программа продолжает работать корректно в обоих случаях, но я использую этот код в расширении postgre, и происходит сбой и потеря соединения с сервером по неизвестным причинам. Как правильно добавить данные в файл без ошибок?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Если вы хотите, чтобы ваш код работал как расширение PostgreSQL, попробуйте использовать процедуры, уже имеющиеся в коде PostgreSQL, который вы можете найти в postgres / src / include / storage / fd.h:

/*
 * calls:
 *
 *  File {Close, Read, Write, Size, Sync}
 *  {Path Name Open, Allocate, Free} File
 *
 * These are NOT JUST RENAMINGS OF THE UNIX ROUTINES.
 * Use them for all file activity...
 *
 *  File fd;
 *  fd = PathNameOpenFile("foo", O_RDONLY);
 *
 *  AllocateFile();
 *  FreeFile();
 *
 * Use AllocateFile, not fopen, if you need a stdio file (FILE*); then
 * use FreeFile, not fclose, to close it.  AVOID using stdio for files
 * that you intend to hold open for any length of time, since there is
 * no way for them to share kernel file descriptors with other files.
 *
 * Likewise, use AllocateDir/FreeDir, not opendir/closedir, to allocate
 * open directories (DIR*), and OpenTransientFile/CloseTransientFile for an
 * unbuffered file descriptor.
 *
 * If you really can't use any of the above, at least call AcquireExternalFD
 * or ReserveExternalFD to report any file descriptors that are held for any
 * length of time.  Failure to do so risks unnecessary EMFILE errors.
 */

Этот код доступен для Linux и Windows.

Примеры можно найти в исходном коде расширения pg_stat_statements: postgres / contrib / pg_stat_statements / pg_stat_statements. c

0 голосов
/ 24 апреля 2020

из Коды системных ошибок Microsoft:

ERROR_ALREADY_EXISTS 183 (0xB7). Невозможно создать файл, когда этот файл уже существует

Я думаю, что это всего лишь напоминание о том, что файл уже существует.

...