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

How to find number of characters in a file without traversing the contents

本文关键字:查找 情况下 文件 字符 遍历      更新时间:2023-10-16

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

这可能吗?

是。

寻找到末端,得到末端的位置,即大小。

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

你可以试试这个:

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

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

在你学会了的大小后,你需要将文件"倒带"回到开头

fseek(fp, 0L, SEEK_SET);

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

虽然不能保证,但在我所知道的所有实现(这两个平台),找到文件的末尾,然后执行ftell,当转换为大积分类型,将给出与上述相同的结果(相同的限制)。

最后:你为什么需要这些信息?如果只是为了分配适当大小的缓冲区,即使使用文本文件GetFileSize(以及搜索结束后的tell)将返回稍大的值超过您可以读取的字节数。你的缓冲区会有点小超大,但这通常不是问题。

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

我想你想知道有多少个字符的原因是这样你就可以有足够大的存储空间来容纳所有的字符。你不需要知道文件有多大就可以存储整个东西。

如果你有一个std::vector<char>,它一开始可以容纳十个字符,然后增长到容纳二十个,然后是一万个。。。当你读取完文件后,它会保存所有的文件,即使你永远不知道会有多少。

我的脑海中浮现的是,看看文件大小,然后将其除以一个字符的字节数?

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

相关文章: