我有一个文本文件,想要在某些地方更改它,例如在4030到4060的字节范围内,这样:
输入文件是一个文本文件,我想获得一个更改的文本输出文件。文本文件中没有随机访问,因此我必须以二进制形式打开文件并进行更改,但输出文件将是二进制文件,我不知道如何获取文本输出。代码如下:
int main()
{
string str, cstr;
ReadTextFile("in", 4030, 4060);
return 0;
}
string ReadTextFile(string path, int from, int to)
{
fstream fp(path.c_str(), ios::in|ios::out|ios::binary);
char *target;
string res, str;
target = new char[to - from + 1];
if (!target)
{
cout << "Cannot allocate memory." << endl;
return "";
}
fp.seekg(from);
fp.read(target, to - from);
target[to - from] = 0;
res = target;
str = changestring(res);
fp.seekg(from);
fp.write((char *)&str, to-from);
return res;
}
string changestring(string str)
{
int l = str.length();
l = l-1;
for (int i = 0; i <= l; i++)
{
if (str[i] == 'C' || str[i] == 'c')
{
int j = i+1;
if (str[j] == 'G' || str[j] == 'g')
str[i] = 'B';
}
}
return str;
}
答案 0 :(得分:0)
你误解了文字和二进制文件。如果以二进制模式打开文件,那么输出将是二进制的。实际上,所有二进制模式都会在Windows系统上停止转换为\ r \ n。换句话说,它影响文本文件中的行结尾,没有别的。
您在输出中得到二进制文件,因为您正在将字符串内部的指针写入输出,而是将字符写入文件。
更改
fp.write((char *)&str, to-from);
到
fp.write(str.c_str(), to-from);
这也可行
fp << str;
要获取文本输出,请写入文本。使用write
还是使用<<
执行此操作无关紧要,文本只是文本。不要考虑两种输出模式,二进制和文本,它是不准确的,它的是什么你写的不是如何你写它确定输出是文本还是二进制