Mdjon26
Mdjon26

Reputation: 2255

Reading one line at a time C++

I have a file that has strings such as

Hello my name is Joe

How are you doing?

Good you?

I'm trying to output that file as it is, but my program is outputting it as "HellomynameisJoeHowAreyouDoing?Goodyou?" I'm having problems with spaces and new lines.

int main (int argc, char* argv[])

{
index_table table1;

string word;
ifstream fileo;

    fileo.open(argv[1]); //where this is the name of the file that is opened

    vector<string> line;

    while (fileo >> word){
        line.push_back(word);
    }
    cout << word_table << endl;
    for (int i=0; i < line.size(); i++)
    {
        if (find(line.begin(), line.end(), "\n") !=line.end()) 
            cout << "ERRROR\n"; //My attempt at getting rid of new lines. Not working though.
        cout << line[i];
    }
    fileo.close();

return 0;

Upvotes: 1

Views: 6960

Answers (2)

Zac Howland
Zac Howland

Reputation: 15872

An alternate solution (with no custom loops):

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

struct line_reader : std::ctype<char>
{
    line_reader() : std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask());
        rc['\n'] = std::ctype_base::space;
        rc[' '] = std::ctype_base::alpha;
        return &rc[0];
    }
};

int main()
{
    std::ifstream fin("input.txt");
    std::vector<std::string> lines;
    fin.imbue(std::locale(std::locale(), new line_reader())); // note that locale will try to delete this in the VS implementation
    std::copy(std::istream_iterator<std::string>(fin), std::istream_iterator<std::string>(), std::back_inserter(lines));
    // file contents now read into lines
    fin.close();
    // display in console
    std::copy(lines.begin(), lines.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    return 0;   
}

Upvotes: 0

P0W
P0W

Reputation: 47794

Just use: std::getline

while (std::getline(fileo, word))
{
        line.push_back(word);
}

And then,

for (int i=0; i < line.size(); i++)
{
  std::cout<<line[i]<<std::endl;
}

OR simply:-

std::copy(line.begin(), line.end(),
           std::ostream_iterator<std::string>(std::cout, "\n") );

//With C++11
for(const auto &l:line)
  std::cout<<l<<std::endl;

Upvotes: 7

Related Questions