0

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

1 回答 1

0

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

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

改变

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

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

这也可以

fp << str;

要获得文本输出,请编写文本。不管你是用write还是用<<,文本就是文本。不要再考虑两种输出模式,二进制和文本,它是不准确的,决定输出是文本还是二进制的是你写的内容而不是你写方式

于 2013-09-01T06:32:48.390 回答