0

这是一个初学者的问题。我试图在文本文件中找到一个字符串并将其替换回同一个文件。以下代码可以很好地将文件内容收集到缓冲区中并替换字符串。但是当我尝试将数据保留回同一个文件时,它充满了一些垃圾字符。请让我知道我做错了什么?

#include <iostream>
#include <fstream>
using namespace std;

const char *fileName = "Test.dat";

int main () {

// This is where we'll put the stuff we read from file
char buffer[ 100 ];


ifstream finout(fileName, ios_base::in | ios_base::out | ios_base::binary);

if(!finout.is_open())
{
    cout << "Can not open file " << endl;
    return(1);
}

while (finout.getline(buffer, sizeof(buffer))
{
    string g( buffer );
    string search = "am";
    string replace = "was";
    long j;

    if ( (j = g.find(str2)) != string::npos)
    {    
        g.replace(g.find(str2), str2.length(), "str");
        finout.write((char *) &g, sizeof(g)); //This won't work 

    }

cout << g << "\n";
finout.close();
return 0;
}

我的 Test.dat 文件包含以下信息:

Hello, How are you?
I am fine.
4

3 回答 3

1
  • 当您作为文本文件进行读/写时,请勿通过以下方式打开它ios_base::binary
  • 你把finout.close();你的阅读循环放在里面,所以它只适用于一行。
  • 当您以文本形式读取/写入文件时,请使用文本流方法和运算符。
于 2013-03-11T06:55:03.673 回答
0

您正在尝试使用sizeof()运算符读取字符串的大小。

这不起作用,因为它是一个关键字,它为您提供对象或类型的非动态大小。

您应该使用g.size()来访问字符串大小!

但首先,您可以处理流处理您的错误:

finout << g;

将完成这项工作。

于 2013-03-11T06:57:32.300 回答
0

首先,您要同时读取和写入文件,因此使用 fstream 而不是 ifstream。其次,你有一个文本文件,所以不要使用 ios_base::binary Third (char*) &g where g is std::string 不起作用,请改用 g.c_str() 。(只需写 finout << g;

现在您可以开始考虑实施...

于 2014-09-10T11:15:51.567 回答