C++ 在随机访问中更改文本文件

C++ 在随机访问中更改文本文件,c++,text,random,binary,C++,Text,Random,Binary,我有一个文本文件,希望在某些地方更改它,例如在字节范围4030到4060,方法如下: 如果有字符“C”或“C”后跟“G”或“G”,则必须在“B”字符中更改 输入文件是一个文本文件,我想得到一个更改后的文本输出文件。文本文件中没有随机访问,所以我必须以二进制形式打开文件并进行更改,但输出文件将是二进制的,我不知道如何获得文本输出。代码如下: int main() { string str, cstr; ReadTextFile("in", 4030, 4060); re

我有一个文本文件,希望在某些地方更改它,例如在字节范围4030到4060,方法如下:

  • 如果有字符“C”或“C”后跟“G”或“G”,则必须在“B”字符中更改
输入文件是一个文本文件,我想得到一个更改后的文本输出文件。文本文件中没有随机访问,所以我必须以二进制形式打开文件并进行更改,但输出文件将是二进制的,我不知道如何获得文本输出。代码如下:

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;
}
intmain()
{
字符串str,cstr;
ReadTextFile(“in”,40304060);
返回0;
}
字符串读取文本文件(字符串路径、int-from、int-to)
{
fstream fp(path.c_str(),ios::in | ios::out | ios::binary);
字符*目标;
字符串res,str;
目标=新字符[到-从+1];
如果(!目标)
{

cout您误解了文本和二进制。如果您以二进制模式打开文件,那么输出将是二进制的,这不是真的。实际上,二进制模式所做的只是停止在Windows系统上转换为\r\n。换句话说,它影响文本文件中的行尾,而不影响其他内容

您在输出中得到的是二进制,因为您正在将字符串的内部指针写入输出,而不是将字符写入文件

改变

fp.write((char *)&str, to-from);

这也会起作用

fp << str;

fp这不是全部代码。我假设有原型可供
main()使用
对于遵循它的函数,否则这些都不会首先编译。在Unix上,二进制文件和文本文件之间没有区别,您可以将其作为其中一个文件打开并使其工作。如果您在其他系统上,并且将该文件作为“文本”文件打开,则CRLF将在输入时映射到NL,然后再次映射到NL在输出时,这意味着您必须担心字节范围的含义。转换是将CG映射到BG?还是将CG映射到B?这是一个巨大的差异,因为第一个是保留长度的,而第二个不是。在许多问题中,如果字符串中的最后一个字符传递到
changestring()
是一个
'c'
'c'
您的代码块随后将索引一个超出字符串结尾的插槽,并进入未定义行为的领域。(感谢Jonathan重新格式化;我可以再次睁开眼睛)。这些注释都不能解决此问题,请注意,我无法以文本格式获取更改的文本文件,这就是问题所在。例如,我的一个输出类似于aaaaaaaaaa(c\E0\00\00\00\00\00X\cccgcgtccggaaaaaa,它是一个必须更改的字符串,但现在我有了文本和二进制形式的tgether。
fp << str;