fstat Возвращает 0 Размер файла

Я думал, что понял FSTAT, я был неправ.

Мне нужно знать размер файла, а затем прочитать из файла.

fileN Имеет путь к файлу и имя файла. Похоже на это. 0.txt

struct stat fileStat;

FILE *fp;
int fd = 0; 


int i;
for(i = 0; i < 100; i++)
{
   fp = fopen(fileN, "r");

   fd = open(fileN, "r"); // I think this is eating my files and making them 0 size.
   fstat(fd, $fileStat);

   printf("%d", fileStat.st_size);

   fclose(fp);
}

Почему я должен использовать fd = open(fileN, "r"); Использовать fstat? Такое ощущение, что я открываю файл дважды.

Если fileStat является структурой, почему я использую fileStat.st_size вместо fileStat->st_size как я делаю, когда я создаю свои собственные структуры? Пример: myString->characters;

И почему код выше печатает 0, когда printf выполняется? И да, файлы имеют размер больше 0, и у меня есть правильное имя файла и путь.

Весь код выше - моя интерпретация кода, который был Google и смешан с моей реализацией проб и ошибок. Вот почему у меня так много вопросов.

РЕДАКТИРОВАТЬ: РЕШЕНИЕ: open() вызывался неправильно и влиял на файлы.

1 ответ

Решение
  • Почему мне нужно использовать fd = open(fileN, "r"); Использовать fstat? Такое ощущение, что я открываю файл дважды.

Так как fstat() требуется дескриптор файла Вы могли бы использовать stat() вместо этого, который принимает имя файла. Или вы могли бы использовать fd = fileno(fp) получить дескриптор файла из stdio FILE,

Кстати, вам нужно позвонить close(fd) в петле.

  • Если fileStat является структурой, почему я использую fileStat.st_size вместо fileStat->st_size, как я делаю, когда создаю свои собственные структуры? Пример: myString-> символы;

Ты используешь -> когда переменная слева является указателем на структуру, вы используете . когда это сама структура. Это основной синтаксис C, ничего особенного для fstat,

  • И почему код выше печатает 0s при выполнении printf? И да, файлы имеют размер больше 0, и у меня есть правильное имя файла и путь.

Ты не звонишь open() правильно. Второй аргумент должен быть int содержащие флаги Поскольку вместо этого вы даете строку, указатель на строку приводится к целому числу, и биты в нем, вероятно, не являются допустимыми флагами открытия. Вам нужно проверить возвращаемое значение open чтобы увидеть, удалось ли это - он вернется -1 если есть ошибка Аналогично с fstat - это, вероятно, возвращает ошибку, потому что fd не является действительным.

Другие вопросы по тегам