从文件中读取而不跳过空格

时间:2016-11-22 23:21:04

标签: c++ string file fstream

我试图创建一个代码,该代码可以从文件中更改一个给定的单词,并将其更改为另一个单词。该程序以一种逐字复制的方式工作,如果它是正常的单词,它只是将其写入输出文件,如果它是我需要更改的那个,则写入我需要的那个改成。但是,我遇到了一个问题。程序不会将空格放在输入文件中。我不知道这个问题的解决方案,我不知道我是否可以使用noskipws,因为我不知道文件的结束位置。

请记住,我是一个完整的新手,我不知道事情是如何运作的。我不知道标签是否足够可见,所以我再次提到我使用C ++

2 个答案:

答案 0 :(得分:0)

由于每个单词的读取都以空格或文件结尾结束,因此您可以简单地检查停止读取的内容是文件末尾还是空格:

if ( reached the end of file ) {
  // What I have encountered is end of file 
  // My job is done
} else {
  // What I have encountered is a whitespace
  // I need to output a whitespace and back to work
}

这里的问题是如何检查eof(文件结尾)。 由于您使用的是ifstream,因此事情会非常简单。 当ifstream到达文件末尾(已读取所有有意义的数据)时,ifstream :: eof()函数将返回true。 假设您拥有的ifstream实例称为输入。

if ( input.eof() == true ) {
  // What I have encountered is end of file
  // My job is done
} else {
  // What I have encountered is a whitespace
  // I need to output a whitespace and back to work
}

PS:ifstream :: good()在到达eof时会返回false或发生错误。检查input.good()== false是否可以作为更好的选择。

答案 1 :(得分:0)

首先,我建议你不要在同一个文件中读写(至少在阅读时不要这样做),因为它会使你的程序更难写/读。

其次,如果你想读取所有空格,最简单的方法就是用getline()读取整行。

可用于将单词从一个文件修改为另一个文件的程序可能如下所示:

void read_file()
{
    ifstream file_read;
    ofstream file_write;
    // File from which you read some text.
    file_read.open ("read.txt");
    // File in which you will save modified text.
    file_write.open ("write.txt");

    string line;
    // Word that you look for to modify.       
    string word_to_modify = "something";
    string word_new = "something_new";

    // You need to look in every line from input file. 
    // getLine() goes from beginning of the file to the end.
    while ( getline (file_read,line) ) {
        unsigned index = line.find(word_to_modify);
        // If there are one or more occurrence of target word.
        while (index < line.length()) {
            line.replace(index, word_to_modify.length(), word_new);
            index = line.find(word_to_modify, index + word_new.length());
        }

        cout << line << '\n';
        file_write << line + '\n';
    }


    file_read.close();
    file_write.close();
}