要求:
我必须读到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
答案 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个字节。这可能导致一些间歇性的,难以追踪的错误。至少,您应该添加一些错误检查。