从文件中读取而不跳过空格
Posted
技术标签:
【中文标题】从文件中读取而不跳过空格【英文标题】:Reading from a file without skipping whitespaces 【发布时间】:2016-11-22 23:21:04 【问题描述】:我正在尝试编写一个代码,该代码将更改文件中的一个给定单词,并将其更改为另一个单词。该程序以一种逐字复制的方式工作,如果它是普通单词,它只是将其写入输出文件,如果它是我需要更改的那个,它会写入我需要更改的那个。但是,我遇到了一个问题。程序没有将空格放在输入文件中的位置。我不知道这个问题的解决方案,我不知道我是否可以使用noskipws
,因为我不知道文件在哪里结束。
请记住,我是一个完全的新手,我不知道事情是如何运作的。不知道标签够不够显眼,再提一下我用的是C++
【问题讨论】:
查看输入修饰符noskipws
。
显然,您确实知道何时到达文件末尾:尝试读取另一个字符或单词失败。
当我使用“noskipws”时,“eof()”不起作用。但我想我不应该用它来检查文件是否已经结束
eof()
无论如何都不是确定文件结尾的方法:您检查流状态,即您尝试读取然后检查流的状态,例如,通过转换它为布尔值,例如,while (stream >> value) ...
。当然,std::ios_base::noskipws
设置时,你需要读取单词之间的空格字符。
【参考方案1】:
由于单词的每次阅读都以空格或文件结尾结束,您可以简单地检查停止阅读的内容是文件结尾还是空格:
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 是否是一个更好的选择。
【讨论】:
建议针对if (!input)
而不是if ( input.eof() == true )
进行测试,因为流中可能出现的错误不仅仅是文件结尾。仅仅测试 EOF 就可以让代码进入错误读取的无限循环。
我怎么知道是空格还是换行符?
检查输入比eof()好,和good()一样。虽然使用 ifstream 作为条件可能会让初学者感到困惑。
我的建议是:每次读一行,然后使用 istringstream 将行分解为单词。顺便说一句,格式化格式错误的文章可能非常困难。【参考方案2】:
首先,我建议您不要在同一个文件中读写(至少不要在读取期间),因为这会使您的程序更难写/读。
其次,如果您想读取所有空格,最简单的方法是使用 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();
【讨论】:
以上是关于从文件中读取而不跳过空格的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何在迭代列表时从列表中删除元素而不跳过未来的迭代