3

我以为我理解 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;

为什么上面的代码在printf执行时会打印 0?是的,文件的大小大于 0,我有正确的文件名和路径。

上面的所有代码都是我对在 Google 上搜索并与我的试错实现混合的代码的解释。这就是为什么我有这么多问题。

编辑:解决方案:open() 被调用错误并影响文件。

4

1 回答 1

7
  • 为什么我需要使用 fd = open(fileN, "r"); 使用 fstat?感觉就像我打开文件两次。

因为fstat()需要文件描述符。您可以改用stat()它,它需要一个文件名。或者您可以使用fd = fileno(fp)从 stdio 获取文件描述符FILE

顺便说一句,您需要close(fd)在循环中调用。

  • 如果 fileStat 是一个结构,为什么我像创建自己的结构时那样使用 fileStat.st_size 而不是 fileStat->st_size?示例:myString->characters;

->左边的变量是指向结构的指针时使用.,当它是结构本身时使用。这是基本的 C 语法,没有特定于fstat.

  • 为什么上面的代码在执行 printf 时会打印 0?是的,文件的大小大于 0,我有正确的文件名和路径。

你没有open()正确调用。第二个参数应该是一个int包含标志。由于您改为提供字符串,指向字符串的指针被强制转换为 int,并且其中的位可能不是有效的打开标志。您需要检查 的返回值以查看它是否成功 -如果有错误open,它将返回。-1与 -- 类似,fstat它可能会返回错误,因为fd它无效。

于 2013-10-11T22:58:43.903 回答