写入文件时出错

问题描述:

我有一个简单的程序。它需要stdin并输出用户刚刚输入的内容。还有就是我用具有几个问题是代码:写入文件时出错

  1. 出于某种原因,在我输入的中间,它停止服用输入和退出程序。 [输入为黑体,下面的输出不是]

    [---] ./ a.out的

    哈珀

    哈珀

    奥巴马

    奥巴马

    唐纳德·特朗普

    唐纳德·特朗普

    本·卡森

  2. 如果我把上面成一个名为FILE1.TXT和写入

    ./a.out < file1.txt 
    

,它会起作用,但如果我把上面的输入放到一个带有“.in”扩展名的文件中并且做同样的事情,它就不会。

  1. 如果我在输入中更改naems,它会改变接受的输入行数。

如果有人告诉我发生了什么,我会很感激。

感谢

我的代码是:

#include <iostream> 
    #include <fstream> 
    #include <sstream> 
    #include <string> 

    using namespace std; 

    int main() { 
     bool empt = false; 
     int num_ppl = 0; 
     int num_spoilt = 0; 
     ofstream names2 ("names2.txt"); 

     if (names2.is_open()) { 
      int a = 0; 
      while(1) { 
      string line; 
      getline(cin, line); 
      if (line.length() == 0) { 
       empt = true; 
       break; 
      } 
      if (((line[a] >= 'A') && (line[a] <= 'Z')) || 
       ((line[a] >= 'a') && (line[a] <= 'z'))) { 
       cout << line << endl; 
       names2 << line; 
       names2 << endl; 
       num_ppl++; 
      } else { 
       break; 
      } 
      a++;  
     } 
     names2.close(); 
    } 
} 
+0

顺便说一句,你可以很容易地发现的问题,如果你只知道如何使用调试器。如果在调试器中一行一行地逐行浏览代码,同时观察变量和它们的值,则很容易很快发现问题。 –

这是你拥有这封信确实是一个失败的信件检查。

让我们把它从开始:

  1. 对于输入Stephen Harper你检查line[0]是一个字母,它是。
  2. 对于输入Barack Obama,你检查line[1]是一封信,它是。
  3. 对于输入Donald Trump您检查line[2]是一封信,它是。
  4. 对于输入Ben Carson你检查line[3]是一个字母,这是,所以你跳出循环。

如果你想确保所有的输入是字母(或空格),你需要在一个单独的循环中做到这一点。或使用standard algorithm functionstd::all_of

if (std::all_of(std::begin(line), std::end(line), 
    [](const char& ch) { 
     return std::isalpha(ch) || std::isspace(ch); 
    })) 
{ 
    ... 
} 
else 
    break; 
+0

好的。谢谢你。我不相信我没有看到。但我仍然不确定我在帖子中提到的第二个问题。为什么会发生? –