Итак, есть несколько проблем с вашим кодом, о чем свидетельствуют все комментарии.
А пока мы пропустим fopen
и сосредоточимся на snprintf
.snprintf
аналогично printf
, за исключением того, что сначала необходимо передать два дополнительных аргумента: char *
, указывающий, где хранить визуализированные символьные данные, и size_t
, указывающий, сколько места доступно в char *
.Идиоматический способ сделать это (предполагая, что char[]
является пунктом назначения) состоит в использовании sizeof()
следующим образом:
int res = snprintf(fileDir, sizeof(fileDir), /* Other arguments omitted */);
snprintf
возвращает количество напечатанных символов (как int
).Если это число больше или равно sizeof(fileDir)
, то все, что находится в fileDir
, будет усечено (но всегда будет NULL
прекращено).
if (res >= sizeof(fileDir)) {
/* fileDir contains an incomplete path, handle this as an error */
}
Наконец, потому что возвращаемое значение snprintf
- это int
, вы не можете передать это как первый аргумент fopen
, потому что он ожидает, что первый аргумент будет const char *
.Так что это должны быть отдельные шаги.
Сказав все это, способ, которым вы строите путь, также кажется неправильным.В полном примере ниже я исправил это:
FILE *ftest2;
int res = snprintf(fileDir, sizeof(fileDir), "%s/%s.txt", hashDirectory, event->name);
if (res >= sizeof(fileDir)) {
fprintf(stderr, "The pathname was truncated. Cannot proceed.\n");
return -1;
}
ftest2 = fopen(fileDir, "wt");
if (!ftest2) {
fprintf(stderr, "Failed to open `%s': %s\n", fileDir, strerror(errno));
return -1;
}
/* Rest of your code */
Важное замечание: если бы первым аргументом snprintf
был указатель на динамически распределенную память (т. Е. От malloc
), вы бы неон не сможет использовать sizeof()
, и вместо этого ему придется явно передавать размер динамически выделенной области.sizeof()
вычисляется во время компиляции (игнорируя VLA ), а не во время выполнения.
(Вам понадобятся #include
string.h
и errno.h
дляstrerror()
позвоните на работу, если хотите использовать эту часть)