在文件内容更改后使用ifstream从同一文件读取(直到EOF)

时间:2009-12-08 13:43:59

标签: c++ file-io seekg

要求:


  

我必须读到EOF(16个字节a   时间)来自特定文件,和   然后说睡5秒钟。现在,   5秒后,当我尝试阅读时   从文件(其内容将   已经附加了那个时间),   预期的设计必须以这种方式   它从它的位置读取   离开前后再次扫描   内容(每次16个字节)直到EOF   到了。

我已编写(基本)代码,使用ifstream从给定文件中读取(直到EOF - 每次16字节),如下所示:

#include <stdio.h> 
#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;


int main() 
{ 

    int fd, i, j, length, pos;
    char buffer[100][16];
    ifstream Read;
    std::ostringstream oss;
    int current_position = 0;
    Read.open("from4to5", ios::binary);

    //Get the size of the file
    Read.seekg(0, ios::end);
    length = Read.tellg();
    Read.seekg(0, ios::beg);


    for(i=0; i<length; i++)
    {

         buffer[i][16] = '\0';
    }

    //Read the file in 16byte segments or eof(), whichever comes first
    //Testing the return condition of the function is preferred, as opposed to testing eof()

    while(Read.get(buffer[i], 17))
    {
        for(j=0; j<=16; j++)
            oss << buffer[i][j];
        cout << "Contents : " << oss.str() << endl;
        oss.seekp(0);
        i++;
    }



    // Output is :
    // Contents : BD8d3700indiaC#E
    // Contents : BD6d4700godgeD3E
    // Contents : BD9d1311badge3TE


    return 0;
}

我需要修改它以符合我的要求。我尝试使用seekg()调用,但不知何故失败了。我想知道,当我第一次访问文件并从文件读取到文件流时,程序会以某种方式对文件进行独占锁定,这意味着我下次无法读取它

有人能告诉我这是怎么做的吗?

文件名:“from4to5” 内容:

  

BD8d3700indiaC#EBD6d4700godgeD3EBD9d1311badge3TE

在5秒内,其他一些进程会写入(追加)到同一个文件“from4to5” 现在,

文件内容:

  

BD8d3700indiaC#EBD6d4700godgeD3EBD9d1311badge3TEBD6d1210clerk41EBD2d1100mayor47EBD4d2810bread6YE

现在,当程序从“from4to5”文件中读取时,它必须从之前离开的点读取,一次读取16个字节,直到遇到EOF。

这次输出的意图是:

// Output is :
// Contents : BD6d1210clerk41E
// Contents : BD2d1100mayor47E
// Contents : BD4d2810bread6YE

2 个答案:

答案 0 :(得分:4)

你必须:
保存你的位置
关闭文件
重新打开文件
寻求你保存的位置并继续阅读直到EOF

答案 1 :(得分:2)

您应该能够清除输入流上的EOF标志并继续阅读。

while (true)
{
    while(Read.get(buffer[i], 17))
    {
        for(j=0; j<=16; j++)
                oss << buffer[i][j];
        cout << "Contents : " << oss.str() << endl;
        oss.seekp(0);
        i++;
    }
    Read.clear();
    sleep(5);
}

如果您正在同时读取文件,那么您可能会遇到问题,而您无法读取所有16个字节。这可能导致一些间歇性的,难以追踪的错误。至少,您应该添加一些错误检查。