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

标签 c++ file fstream getline

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

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] 并将其包含到现成的文件之一中。架子循环缓冲区(在类似 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/

相关文章:

c++ - 在堆 : small pieces or big piece 上分配的最佳方法是什么

c++ - 如何定义递归类型?

c++ - 为什么在传递 long long 时调用具有两个 double 类型参数的重载函数?

c++ - 保持 fstream 打开或每次需要使用时打开它哪个更有效?

c++ - 为什么 fstream.read 和 fstream.write 使用 char 而不是 unsigned char?

c++ - 有效使用 enable_if 和 C++ 模板来避免类特化

python - 使用来自不同文件 pygame 的 Sprite 对象类

file - 如何使用 SVN 提交除一个文件之外的所有文件

php - 将数据保存到文件和。将其保存到 MySQL DB

c++ - 从以新行结尾的txt文件读取时获取故障位