【问题标题】:fstat Returning 0 File Sizefstat 返回 0 文件大小
【发布时间】:2013-10-11 22:45:05
【问题描述】:

我以为我理解了 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-&gt;st_size,就像我在创建自己的结构时那样?示例:myString-&gt;characters;

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

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

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

【问题讨论】:

  • 需要查看fopen、open和fstat的返回值。此外,未正确调用 open()。
  • 如何检查 fopen 的返回值。 if(fp == NULL) 返回 -1;?
  • 这是一种方式。通常使用 printf 表示 fopen 失败。

标签: c fstat


【解决方案1】:
  • 为什么我需要使用 fd = open(fileN, "r");使用 fstat?感觉好像打开了两次文件。

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

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

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

当左边的变量是指向结构的指针时,你使用-&gt;,当它是结构本身时,你使用.。这是基本的 C 语法,与 fstat 无关。

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

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

【讨论】:

  • 我在其他地方设置了 fileN,相信我正在打印它,它具有正确的路径和文件名。删除它会停止删除文件内的数据:fd = open(fileN, "r");
  • @MikeJohn,听从他的建议并检查返回值。
  • 是的,open() 调用不正确。我改为使用 fileno(fp)。
猜你喜欢
  • 2015-07-08
  • 2011-02-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多