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
не является действительным.