【问题标题】:Initializing a vector from a text file从文本文件初始化向量
【发布时间】:2013-09-22 18:41:31
【问题描述】:

我正在尝试编写一个可以读取文本文件的程序,并将其中的每个单词存储为字符串类型向量中的条目。我确信我这样做是非常错误的,但是自从我尝试这样做以来已经很长时间了,以至于我忘记了它是如何完成的。任何帮助是极大的赞赏。提前致谢。

代码:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> input;
    ifstream readFile;

    vector<string>::iterator it;
    it = input.begin();

    readFile.open("input.txt");

    for (it; ; it++)
    {
        char cWord[20];
        string word;

        word = readFile.get(*cWord, 20, '\n');

        if (!readFile.eof())
        {
            input.push_back(word);
        }
        else
            break;
    }

    cout << "Vector Size is now %d" << input.size();

    return 0;
}

【问题讨论】:

  • 以前从未有人问过这个问题
  • 我有点错过这个问题中的问题。尝试当前代码时出了什么问题?此外,缺少部分规范。是否保证每个单词都在文件中的单独行中?
  • 您使用数组cWord 来存储单词,而您可以直接读入word 变量,这是有原因的吗?

标签: c++ string file-io vector formatted-input


【解决方案1】:

许多可能的方法之一很简单:

std::vector<std::string> words;
std::ifstream file("input.txt");

std::string word;
while (file >> word) {
    words.push_back(word);
}

operator &gt;&gt; 只负责读取除以空格(包括换行符)的单词。


如果您要逐行阅读,您可能还需要显式处理空行:

std::vector<std::string> lines;
std::ifstream file("input.txt");

std::string line;
while ( std::getline(file, line) ) {
    if ( !line.empty() )
        lines.push_back(line);
}

【讨论】:

    【解决方案2】:
    #include <fstream>
    #include <vector>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <iterator>
    
    using namespace std;
    
    int main()
    {
        vector<string> input;
        ifstream readFile("input.txt");
        copy(istream_iterator<string>(readFile), {}, back_inserter(input));
        cout << "Vector Size is now " << input.size();
    }
    

    或者,更短:

    int main()
    {
        ifstream readFile("input.txt");
        cout << "Vector Size is now " << vector<string>(istream_iterator<string>(readFile), {}).size();
    }
    

    我不打算解释了,因为 StackOverflow 上已经有无数的解释了 :)

    【讨论】:

    • 不想成为那个脾气暴躁的老家伙,但如果已经有无数种解释,正确的做法不就是将其标记为重复吗?
    • @us2012 是的。但是写起来更快。可悲的是,无数个重复意味着有半亿个坏例子,我不想筛选。但是,请随意关闭!
    • 我没有意识到已经有很多解释,我可能无法想出合适的搜索词。不过谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多