【问题标题】:ifstream from next/new line in c++来自c ++中下一个/新行的ifstream
【发布时间】:2021-03-09 17:36:56
【问题描述】:

我将一组数据存储在一个文件中,这些数据基本上是名称。我的任务是获取每个名字的所有首字母。这是文件:

Jack fisher
goldi jones
Kane Williamson
Steaven Smith

我只想从每行中取出第一个单词(例如 jack、goldi、kane、Steaven) 我为它写了下面的代码,只是为了取出2个名字。这里是:

    string first,last;
    ifstream Name_file("names.txt");
    Name_file>>first;
    Name_file>>endl;
    Name_file>>last;
    cout<<first<<" "<<last;

它给出了错误。如果我删除 endl,它将采用第一个全名(Jack,fisher),而我希望它应该采用(jack,goldi)。怎么做 ?任何想法?提前感谢您的帮助。

【问题讨论】:

  • Name_file&gt;&gt;endl; 删除这个。这是不必要的。提取运算符跳过单词前的空格。此外,即使需要它,它也是在错误的地方。换行符在last 之后。

标签: c++ c++11 fstream ifstream


【解决方案1】:

Name_file&gt;&gt;endl; 总是错的。

即使那样,你也不能像那样使用&gt;&gt;,它会停在一个空格上,这就是为什么当你删除endl你会看到firstlast只包含第一行的问题.

使用std::getline 来遍历您的文件并获取全名,然后在第一个空格处拆分行以获取名字:

ifstream Name_file("names.txt");

std::string line;
while (std::getline(Name_file, line))
{
  std::string firstName = line.substr(0, line.find(' '));
  //do stuff with firstName..
}

【讨论】:

  • 或者,您可以使用 std::istringstreamoperator&gt;&gt; 从读取的每个 line 中提取名字:while (std::getline(Name_file, line)) { std::istringstream iss(line); std::string firstName; iss &gt;&gt; firstName; ... }
【解决方案2】:

虽然我不介意“戴帽子的公鸡”实现,但我认为当输入突然包含很长的行时,它的效率可能会降低一些。

我会使用ignore() 删除该行的其余部分:

int main()
{
    std::ifstream nameFile("names.txt");
    std::string firstName;

    while (nameFile >> firstName)
    {
        // You got a first name.
        // Now dump the remaing part of the line.
        nameFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}

【讨论】:

    【解决方案3】:

    我希望这能解决您的问题。

    ifstream Name_file;
    string line;
    Name_file.open("names.txt");
    if(Name_file.fail()){ cerr<<"Error opening file names.txt !!"<<endl;return;}
    
    vector<string> v; // array to store file names;
    
    while(Name_file >> line){
        string word;
        getline(Name_file, word);
        v.push_back(line);
    }
    
    // printing the first names
    for(int i = 0; i < v.size();i++){
        cout<<v[i]<<endl;
    }
    

    【讨论】:

    • @HattedRooster 感谢您的指出。
    • @MartinYork 现在更好还是我应该整体删除答案。并感谢您指出这些新手错误:)
    • while 循环内,您可以使用Name_file.ignore() 而不是std::getline() 来跳过当前行的其余部分(请参阅MartinYork 的回答)。没有必要浪费一个不会用于任何事情的std::string
    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多