随机访问更改文本文件

时间:2013-09-01 01:33:34

标签: c++ text random binary

我有一个文本文件,想要在某些地方更改它,例如在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;
}

1 个答案:

答案 0 :(得分:0)

你误解了文字和二进制文件。如果以二进制模式打开文件,那么输出将是二进制的。实际上,所有二进制模式都会在Windows系统上停止转换为\ r \ n。换句话说,它影响文本文件中的行结尾,没有别的。

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

更改

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

fp.write(str.c_str(), to-from);

这也可行

fp << str;

要获取文本输出,请写入文本。使用write还是使用<<执行此操作无关紧要,文本只是文本。不要考虑两种输出模式,二进制和文本,它是不准确的,它的是什么你写的不是如何你写它确定输出是文本还是二进制