我对c ++中的文件输入有疑问。我希望能够创建一个字符串变量并从文件中读取SENTENCE。我该怎么做?这是我到目前为止的代码。
#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;
}
问题是,当我尝试从文件中读取一个句子时,它只读取一个单词而不是句子。
因此,如果我在文本文件中有一个句子(假设没有换行符),那么它只打印出单个单词。
我该如何解决这个问题?
答案 0 :(得分:1)
如果你只想分开'。'然后贾森考德威尔回答你正在寻找的东西:
#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();
}
请注意,此代码使用c ++ 11功能(auto,emplace_back ...)
但是如果你假设一个句子有点复杂的话,我会再次提出与Jason相同的建议,使用正则表达式。但请确保您的编译器正确实现它们(例如:g ++ - 4.9)
此answer告诉您如何操作。为简单起见,您可能必须使用std :: getline拆分字符串。
编辑:添加了对文件的检查和有关c ++ 11功能的注释。
答案 1 :(得分:0)
getline
是您正在寻找的内容:
http://www.cplusplus.com/reference/string/string/getline/
对于更复杂的模式匹配,正则表达式可能很有用: http://www.cplusplus.com/reference/regex/
此处发布了一个类似的问题,其中包含大量回复: http://www.cplusplus.com/forum/general/94419/
答案 2 :(得分: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;
}
对于凌乱的帖子感到抱歉,这就像我的第一篇文章,我不知道这个拳击事情是如何运作的xd
答案 3 :(得分:0)
使用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;
}
答案 4 :(得分:0)
问题是,当我尝试从文件中读取一个句子时,它只读取一个单词而不是句子。
默认情况下,>>
提取运算符会跳过空格,因此,它只提取一个单词。
要一次阅读一行,您可以使用std::getline
。以下代码将读取文本文件中的第一行。您可以将getline
放在while循环中以逐行读取。
int main()
{
string line;
ifstream fin("file.txt");
// Read in the sentence from the file
getline(fin, line);
cout << line << '\n';
return 0;
}