【问题标题】:How to find number of characters in a file without traversing the contents如何在不遍历内容的情况下查找文件中的字符数
【发布时间】:2012-02-26 06:39:38
【问题描述】:

在一个项目中,我必须读取一个文件,我必须处理文件中的字符数,有没有一种方法可以在不逐字符读取的情况下获取字符数(否则我将不得不读取文件两次,一次只是为了查找其中的字符数)。

有可能吗?

【问题讨论】:

  • 在纯标准 C++ 中,或者操作系统特定的 API 也可以?有不可移植的函数(例如GetFileSizeEx())来获取文件的大小。
  • 你的意思是要获取文件的大小?
  • 这是家庭作业,我不允许使用 API。我只能使用 iostream 和 fstream 函数。甚至不是字符串。

标签: c++ file-io file-read


【解决方案1】:

是的。

寻尾得到端的位置即大小。

FILE*  file = fopen("Plop");
fseek(file, 0, SEEK_END);
size_t  size = ftell(file);      // This is the size of the file.
                                 // But note it is in bytes.
                                 // Also note if you are reading it into memory this is
                                 // is the value you want unless you plan to dynamically
                                 // convert the character encoding as you read.

fseek(file, 0, SEEK_SET);        // Move the position back to the start.

在 C++ 中,流具有相同的功能:

std::ifstream   file("Plop");
file.seekg(0, std::ios_base::end);
size_t size = file.tellg();

file.seekg(0, std::ios_base::beg);

【讨论】:

  • 谢谢,您的回答和接受的回答都同样有帮助,我选择了得票更多的那个。再次感谢您的回答!
【解决方案2】:

你可以试试这个:

FILE *fp = ... /*open as usual*/;
fseek(fp, 0L, SEEK_END);
size_t fileSize = ftell(fp);

但是,这会返回文件中 字节 的数量,而不是 字符 的数量。除非已知编码是每个字符一个字节(例如 ASCII),否则它是不一样的。

在了解大小后,您需要将文件“倒回”到开头:

fseek(fp, 0L, SEEK_SET);

【讨论】:

  • UTF-8 是可变长度编码。
【解决方案3】:

简单的答案是否定的。更准确地说,它取决于系统:在 Unix,这是可能的(例如使用stat);在 Windows 下,它不是 可能适用于文本文件,但如果您正在读取二进制文件, 有一个函数GetFileSize可以使用。

虽然不能保证,但在我知道的所有实现中(对于 这两个平台),寻找文件的末尾,然后做一个 ftell,将返回一些东西,当转换为足够的 大整数类型,将给出与上述相同的结果(使用 相同的限制)。

最后:为什么需要这些信息?如果只是分配一个 适当大小的缓冲区,即使是文本文件,GetFileSize(和 tell 求完后)会返回一个稍大的值 比您可以读取的字节数。你的缓冲会稍微 过大,但这通常不是问题。

【讨论】:

    【解决方案4】:

    我认为您可能正在寻找 动态内存 解决方案。您实际问的是“有没有办法在不读取文件的情况下获取文件中的字符数?”。答案(假设每个字符一个字节)是肯定的,您可以使用stat 调用来获取文件大小,而以字节为单位的文件大小是字符数。对于 UTF-8,答案是否定的,但让我们暂时把它放在一边,因为刚刚学习的计算机科学家通常不担心国际化。

    我认为您想知道有多少个字符的原因是您可以拥有足够大的存储空间来容纳所有字符。您无需知道文件有多大即可存储整个内容。

    如果你有一个std::vector<char>,它可以开始容纳十个字符,然后增长到二十个,然后一万个……当你读完文件时,它会容纳所有字符,甚至虽然你永远不知道会有多少。

    【讨论】:

      【解决方案5】:

      我的想法是,看看文件大小,然后将其除以单个字符的字节数?

      在处理空白和结束行等时会出现问题。

      【讨论】:

        猜你喜欢
        • 2021-03-26
        • 1970-01-01
        • 2010-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 2011-04-30
        相关资源
        最近更新 更多