Стандартная библиотека также предоставляет функции stat
и fstat
, которые позволяют вам заполнить struct stat
для непосредственного определения размера файла.stat
принимает путь к файлу и указатель на stuct stat
(объявлено с автоматическим хранением - это нормально), а fstat
принимает целочисленный дескриптор файла в качестве аргумента.
Использование stat
дляопределить, является ли размер файла больше нуля, достаточно просто вызвать stat
и затем проверить элемент структуры .st_size
.
При соответствующей проверке вы можете сделать:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define MAXC 1024
int main (void) {
char fn[MAXC]; /* filename */
struct stat sbuf; /* stat buffer */
FILE *fp;
/* prompt, read filename, trim line-end */
fputs ("enter filename: ", stdout);
if (!fgets (fn, MAXC, stdin)) {
fputs ("(user canceled input)\n", stderr);
return 1;
}
fn[strcspn (fn, "\r\n")] = 0;
/* call stat, fill stat buffer, validate success */
if (stat (fn, &sbuf) == -1) {
perror ("error-stat");
return 1;
}
/* test sbuf.st_size to check if file size > 0 */
if (sbuf.st_size > 0) {
puts ("opened ab");
fp = fopen (fn, "ab");
}
else {
puts ("opened wb");
fp = fopen (fn, "wb");
}
/* rest of code... */
}
В любом случае, используя seek
или stat
, вы можете определить, что вам нужно.