如何在不遍历内容的情况下查找文件中的字符数

时间:2012-02-03 16:42:23

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

在一个项目中,我必须读取一个文件,并且我必须使用文件中的字符数,并且有一种方法可以获得字符数而无需逐个字符地读取它(否则我将不得不读取文件两次,只是为了找到它中的字符数。)

甚至可能吗?

5 个答案:

答案 0 :(得分:11)

寻找最终获得大小结束的位置。

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);

答案 1 :(得分:8)

你可以试试这个:

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

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

你需要"倒带"在您了解了尺寸之后,文件又回到了开头:

fseek(fp, 0L, SEEK_SET);

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

我认为你想知道有多少个字符的原因是你可以拥有足够大的存储空间来容纳它们。您不需要知道存储整个文件的文件大小。

如果你有一个std::vector<char>,它可以开始能够容纳十个字符,然后成长为二十,然后一万......当你完成阅读文件后,它将全部保存,即使你从来不知道会有多少。

答案 4 :(得分:1)

关闭我的头脑是看文件大小并将其除以单个字符的字节数?

处理空白区和终点线等时出现问题。