我试图创建一个代码,该代码可以从文件中更改一个给定的单词,并将其更改为另一个单词。该程序以一种逐字复制的方式工作,如果它是正常的单词,它只是将其写入输出文件,如果它是我需要更改的那个,则写入我需要的那个改成。但是,我遇到了一个问题。程序不会将空格放在输入文件中。我不知道这个问题的解决方案,我不知道我是否可以使用noskipws
,因为我不知道文件的结束位置。
请记住,我是一个完整的新手,我不知道事情是如何运作的。我不知道标签是否足够可见,所以我再次提到我使用C ++
答案 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();
}