Reading line from text file and putting the strings into a vector?

前端 未结 3 1582
终归单人心
终归单人心 2020-11-29 03:03

I am trying to read each line of a textfile which each line contains one word and put those words into a vector. How would i go about doing that?

This is my new code

相关标签:
3条回答
  • 2020-11-29 03:26

    Simplest version:

    std::vector<std::string> lines;
    for (std::string line; std::getline( ifs, line ); /**/ )
       lines.push_back( line );
    

    I'm omitting the includes and other gunk. My version is almost the same as FailedDev's but by using a 'for' loop I put the declaration of 'line' in the loop. This is not just a trick to reduce the line count. Doing this reduces the scope of line -- it disappears after the for loop. All variables should have the smallest scope possible, so therefore this is better. For loops are awesome.

    0 讨论(0)
  • 2020-11-29 03:42

    @FailedDev did, indeed, list the simplest form. As an alternative, here is how I often code that loop:

    std::vector<std::string> myLines;
    std::copy(std::istream_iterator<std::string>(myfile),
              std::istream_iterator<std::string>(),
              std::back_inserter(myLines));
    

    The entire program might look like this:

    // Avoid "using namespace std;" at all costs. Prefer typing out "std::"
    // in front of each identifier, but "using std::NAME" isn't (very) dangerous.
    #include <iostream>
    using std::cout;
    using std::cin;
    #include <fstream>
    using std::ifstream;
    #include <string>
    using std::string;
    #include <vector>
    using std::vector;
    #include <iterator>
    using std::istream_iterator;
    #include <algorithm>
    using std::copy;
    
    int main()
    {
    
        // Store the words from the two files into these two vectors
        vector<string> DataArray;
        vector<string> QueryArray;
    
        // Create two input streams, opening the named files in the process.
        // You only need to check for failure if you want to distinguish
        // between "no file" and "empty file". In this example, the two
        // situations are equivalent.
        ifstream myfile("OHenry.txt"); 
        ifstream qfile("queries.txt");
    
        // std::copy(InputIt first, InputIt last, OutputIt out) copies all
        //   of the data in the range [first, last) to the output iterator "out"
        // istream_iterator() is an input iterator that reads items from the
        //   named file stream
        // back_inserter() returns an interator that performs "push_back"
        //   on the named vector.
        copy(istream_iterator<string>(myfile),
             istream_iterator<string>(),
             back_inserter(DataArray));
        copy(istream_iterator<string>(qfile),
             istream_iterator<string>(),
             back_inserter(QueryArray));
    
        try {
            // use ".at()" and catch the resulting exception if there is any
            // chance that the index is bogus. Since we are reading external files,
            // there is every chance that the index is bogus.
            cout<<QueryArray.at(20)<<"\n";
            cout<<DataArray.at(12)<<"\n";
        } catch(...) {
            // deal with error here. Maybe:
            //   the input file doesn't exist
            //   the ifstream creation failed for some other reason
            //   the string reads didn't work
            cout << "Data Unavailable\n";
        }
    }
    
    0 讨论(0)
  • 2020-11-29 03:48

    Simplest form:

    std::string line;
    std::vector<std::string> myLines;
    while (std::getline(myfile, line))
    {
       myLines.push_back(line);
    }
    

    No need for crazy c thingies :)

    Edit:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    
    int main()
    
    {
        std::string line;
        std::vector<std::string> DataArray;
        std::vector<std::string> QueryArray;
        std::ifstream myfile("OHenry.txt");
        std::ifstream qfile("queries.txt");
    
        if(!myfile) //Always test the file open.
        {
            std::cout<<"Error opening output file"<< std::endl;
            system("pause");
            return -1;
        }
        while (std::getline(myfile, line))
        {
            DataArray.push_back(line);
        }
    
        if(!qfile) //Always test the file open.
        {
            std::cout<<"Error opening output file"<<std::endl;
            system("pause");
            return -1;
        }
    
        while (std::getline(qfile, line))
        {
            QueryArray.push_back(line);
        }
    
        std::cout<<QueryArray[20]<<std::endl;
        std::cout<<DataArray[12]<<std::endl;
        return 0;
    }
    

    Keyword using is illegal C++! Never use it. OK? Good. Now compare what I wrote with what you wrote and try to find out the differences. If you still have questions come back.

    0 讨论(0)
提交回复
热议问题