如何在不遍历内容的情况下查找文件中的字符数
How to find number of characters in a file without traversing the contents
在一个项目中,我必须读取一个文件,并且我必须处理文件中的字符数,并且有没有一种方法可以在不逐个字符读取的情况下获得字符数(否则我将不得不读取文件两次,一次只是为了找到文件中的角色数)。
这可能吗?
是。
寻找到末端,得到末端的位置,即大小。
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>
,它一开始可以容纳十个字符,然后增长到容纳二十个,然后是一万个。。。当你读取完文件后,它会保存所有的文件,即使你永远不知道会有多少。
我的脑海中浮现的是,看看文件大小,然后将其除以一个字符的字节数?
处理空白和结束线等时会出现问题。
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 在无法访问向量的情况下查找迭代器的末尾
- 在不进行排序的情况下查找数组中n个最小值的索引
- 在给定元素在螺旋上的位置的情况下,在二维数组中查找元素
- 在没有查找表的情况下计算大数的位长度
- 如何在给定任意数量的整数的情况下创建一个唯一键?并使用该键存储,然后从地图中查找
- 在没有比较运算符的情况下查找 2 个数字之间的最小值
- 为什么在这种情况下不考虑依赖于参数的查找?
- 我如何在C 中制作算法,以在不重复的情况下查找集合的变化(即n元素,选择k)
- 在给定长度无限循环的情况下,在Collatz猜想中查找起始数的代码
- 在没有字符串或字符帮助的情况下查找数字的反面(例如:2500 reverse 0025)
- 如何在不使用目录的情况下在磁盘上查找文件
- 如何在不使用if语句的情况下查找数组中的最大值和最小值
- 如何在不复制或查找的情况下获取 const 字符串流缓冲区的长度?
- using声明如何减少可用于在没有 ADL 的情况下查找的名称
- 在没有第三方工具/项目的情况下,在 MFC C++发布版本中查找内存泄漏
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- C/C++宏,用于在不使用三元运算符的情况下查找两个数字的最大值
- 如何在不遍历内容的情况下查找文件中的字符数