1

I have a question about file input in c++. I want to be able to create a string variable and read in a SENTENCE from the file. How would I do this? This is the code I have so far.

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

using namespace std;

int main()
{
string word;
ifstream fin;

// Open the file
fin.open("file.txt");

// Read in the sentence from the file
fin >> word;

cout << word << endl;

return 0;
}

The problem is, when I try to read in a sentence from the file, it only reads in a word and not the sentence.

So if I had a sentence in a textfile (assuming that there is no line break) it would only print out the single word.

How would I fix this?

plee
  • 109
  • 2
  • 8

5 Answers5

1

If you just want to split on '.' then Jason Caldwell answer is what you were looking for:

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

static std::string trim(const std::string& str)
{
    size_t first = str.find_first_not_of(" \n\t\r\v");
    size_t last = str.find_last_not_of(" \n\t\r\v");
    return str.substr(first, (last-first+1));
}

int main()
{
    std::vector<std::string>    sentences;

    std::ifstream ifs("sentences.txt");
    if (ifs.is_open() == false)
    { std::cerr << "Couldn't open file..." << std::endl; return -1; }

    std::string line;
    while(getline(ifs,line, '.'))
    { sentences.emplace_back(trim(line) + "."); }

    for (auto sentence : sentences)
    { std::cout << "sentence: " << sentence << std::endl; }
    ifs.close();
}

Note that this code uses c++11 features (auto , emplace_back...)

But if you assume that a sentence is something a bit more complex, I would suggest the same as Jason once again, use regexes. But be sure that your compiler implement them correctly (ex: g++-4.9)

This answer show you how to do it. You will probably have to split your string with std::getline for simplicity.

Edit: added check on file and note about c++11 features.

Community
  • 1
  • 1
vianney
  • 161
  • 6
1

The problem is, when I try to read in a sentence from the file, it only reads in a word and not the sentence.

The >> extraction operator skips whitespace by default, hence, it only extracts one word.

To read a line at a time, you can use std::getline. The following code will read the first line in the text file. You can put getline inside a while loop to read line by line.

int main()
{
    string line;
    ifstream fin("file.txt");

    // Read in the sentence from the file
    getline(fin, line);
    cout << line << '\n';

    return 0;
}
Andreas DM
  • 9,654
  • 6
  • 31
  • 58
0

getline is what you're looking for: http://www.cplusplus.com/reference/string/string/getline/

For more complex pattern matching, regex might be useful: http://www.cplusplus.com/reference/regex/

A similar question was posted here with lots of replies: http://www.cplusplus.com/forum/general/94419/

0
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    string word; // You have to give word an actual string for this to work xd
    ofstream writer("file.txt");//Creating the text document // Creating the variable that writes to it
    ifstream fin("file.txt");//The variable that reads it`

    if(!writer){//Checking to make sure it nothing bad occurred when opening file
        cout << "An error occurred opening " << writer;
        return 1; //Return an error occurred
    }else{
        cout << word; // Print the string word whatever it is on file.txt
    }

    char letter;//To get every letter that get iterated over
    vector <string> textInFile(999999);//Saves letter into an array

    if(!fin){
        cout<<"Problem opening"<<fin; // Check if file opened safely
    }else{
        for(int x = 0; ! fin.eof(); x++){//eof = End of file // It basically iterates over the entire .txt;
            fin.get(letter); // Gets every letter
            textInFile[x] = letter; // vector stores the letters
        }

        for(int x = 0; x < textInFile.size(); x++){ // For size of <vector> textInFile iterate over all indexes
            cout << textInFile[x]; // Prints every letter in the vector
        }
    }
    cout<<endl;
    fin.close();

    return 0;
}

Sorry about the messy post, this is like my first post and I have no clue how this boxing things works xd

saloomi2012
  • 317
  • 2
  • 12
J. Purcell
  • 21
  • 4
0

Use getline

#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include <algorithm>
#include <cctype>

using namespace std;

int main()
{
   string sentence;
   set <string> sentences;

  ifstream file("thisfile.txt");

  if(file.is_open())
  {
    while(getline(file, sentence, "."))
    {
      sentence.erase(remove_if(sentence.begin(), sentence.end(), IsChars("\n")), sentence.end());
      sentences.insert(sentence);
    }
  }

  file.close(); //close file

  return 0;
}