C ++如何逐字读取文件(字符串),但显示方式与文本文件完全相同

时间:2018-04-14 23:23:12

标签: c++ string fstream ifstream

在将文本输出到cmdPrompt时,我无法弄清楚如何获取要显示的换行符。 .text文件是这样的:

"Roses are red
 violets are blue
 sugar is sweet
 and so are you"

我的循环代码是:

#define newLn "\n"
ifstream ins; //these two are near the top where the programs opens the file

string aString;      

while(ins >> aString){
        if(aString != newLn){
        cout << aString << ' ';
        }
        else
            cout << endl;
   }

它在文本中读得很好,但它只是显示如下:

Roses are red violets are blue sugar is sweet and so are you

我不知道如何显示它与文本文件中的完全一样(每个语句后都有换行符。我知道你可以用while(nextCharacter!= newLn)来读取字符,但是字符串让我难住了。

2 个答案:

答案 0 :(得分:1)

使用格式化提取功能时,例如:

while(ins >> aString){

您将丢失流中存在的所有空白字符。

为了保留空白,您可以使用std::getline

std::string line;
while ( getline(ins, line) )
{
   std::cout << line << std::endl; 
}

如果您需要从行中提取单个标记,则可以使用std::istringstream处理文本行。

std::string line;
while ( getline(ins, line) )
{
   cout << line << std::endl; 
   std::istringstream str(line);
   std::string token;
   while ( str >> token )
   {
      // Use token
   }
}

答案 1 :(得分:1)

您正在使用&#34; fstream提取运算符&#34;读入文件内容。所以请记住,操作员不会读取占用空白和新行,但它认为它们是单词的结尾。因此,请使用std::getline

while(std::getline(ins, aString) )
    std::cout << aString << std::endl;