gpt4 book ai didi

c++ - 用c++同时读写同一个文件

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:58 28 4
gpt4 key购买 nike

我在遍历行时尝试读取和写入文件。在每一行,我都会进行评估以确定是否要将其写入文件或跳过它并移至下一行。这基本上是我目前所拥有的框架。

void readFile(char* fileName)
{
char line[1024];
fstream file("test.file", ios::in | ios::out);

if(file.is_open())
{
while(file.getline(line,MAX_BUFFER))
{

//evaluation

file.seekg(file.tellp());
file << line;
file.seekp(file.tellg());
}
}
}

当我阅读这些行时,我似乎对复制到行变量中的字符串的起始索引有疑问。例如,我可能期望行变量中的字符串是“000/123/FH/”,但实际上它是“123/FH/”。我怀疑 file.seekg(file.tellp()) 和 file.seekp(file.tellg()) 有问题,但我不确定它是什么。

最佳答案

从您的代码 [1] 和问题描述中不清楚文件中的内容以及您期望“000/123/FH/”的原因,但我可以声明 getline 函数是一个缓冲输入,您没有访问缓冲区的代码。一般来说,不建议同时使用缓冲和非缓冲 i/o,因为这需要对缓冲机制有深入的了解,然后依赖于该机制不会随着库的升级而改变。

您似乎想要进行字节或字符[2] 级别的操作。对于小文件,应该将整个文件读入内存,对其进行操作,然后覆盖原来的文件,需要一个打开、读取、关闭、打开、写入、关闭的顺序。对于大文件,您需要使用 fread 和/或其他一些较低级别的 C 库函数。

因为您使用的是 C++,所以执行此操作的最佳方法是创建您自己的类,该类处理读取并包括行分隔符 [3] 到一个现成的 - shelf 循环缓冲区(在类 STL 容器的情况下使用 malloc 或插件分配器)或您在静态分配的字节数组上作为模板开发的循环缓冲区(如果您想要高速低资源利用率) .在后一种情况下,大小至少需要与最长的行一样大。 [4]

无论哪种方式,您都希望添加到类中以二进制模式打开文件并公开所需的方法以对任意行执行行级操作。有人说(我个人同意)利用 Bjarne Stroustrup 在 C++ 中的类封装可以使类更容易仔细测试。这样的行操作类将封装随机访问 C 函数和无缓冲的 i/o,并为最大化速度留出机会,同时允许在系统和应用程序中使用即插即用。

注意事项

[1] 当前位置的查找只是测试功能,在当前代码状态下,还没有重新定位当前文件指针。

[2] 请注意,在当今的计算环境中,字符级和字节级操作之间存在差异,在当今的计算环境中,utf-8 或其他一些 unicode 标准现在在许多领域(尤其是网络领域)比 ASCII 更为普遍。

[3] 请注意,行分隔符取决于操作系统、版本,有时还取决于设置。

[4] 循环缓冲区在速度方面的优势在于,您可以使用 fread 一次读取多行,并使用快速迭代找到下一行的结尾。

关于c++ - 用c++同时读写同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44445897/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com