在C ++中查找文本中的单词并打印下一些特定行

时间:2015-10-08 17:50:00

标签: c++ io

我在C ++中编写了一个编写.txt文件的代码。 然后我想再次打开代码并提供一些信息,所以我可以根据我给出的输入获得一个新文本。 例如,我想给出一个月的名称,并在另一个.txt文件中打印在" 11月和#34;之后的所有行。 我找到了一些解决方案,但它们都没有为我工作!

我在堆栈溢出时发现的一个解决方案如下:

void Keyword(ifstream & stream, string token) {
    string line;
    while (getline(stream, line)) {
        if (line.find(token) != string::npos) {
            cout << line << endl;
        }
    }
    cout << token << " not found" << endl;
}

我无法使用上面的代码打印下一行。

任何建议都会有所帮助! 谢谢!

3 个答案:

答案 0 :(得分:0)

如果您想对&#39; Read&#39;等文件执行操作和/或&#39;写&#39;,您可能希望在网上搜索(或者如果您有C ++书籍),例如&#34;使用C ++和#34;进行文件I / O操作。 。无论如何,C ++有2个基本类来处理ifstreamofstream的文件。要使用它们,您必须在标题fstream中包含ethier(即#include<fstream>)或将其分别包含在#include<ifstream>#include<ofstream>中。ifstream基本上用于所有输入操作,例如读取文件等。类似地ofstream用于所有输出操作,例如将数据写入文件。

您可以通过执行以下操作打开文件并向其写入数据

ofstream myFile("filename");// Create an instance of ofstream and open file for writing data

并将数据写入文件使用<<运算符,如下所示

myFile<<data;

同样,您可以按如下方式打开文件并读取数据,

ifstream myFile("filename");//Create an instance of ifstream and open file to read data

并从文件中读取数据使用>>运算符,如下所示,

myFile>>data;

您也可以使用void open(const char *filename, ios::openmode mode);方法打开文件,如下所示,

//Writing only
ofstream outFile;
outFile.open("filename.txt",ios::out);


//Reading only 
ifstream inFile;
inFile.open("filename.txt",ios::in);

//For reading and writing
fstream file;
file.open("filename.txt",ios::in|ios::out);


//For closing File
outFile.close();
//or
inFile.close();
//or
file.close(); 

注意open()方法采用各种标记,例如ios::in用于阅读模式,ios::out用于写入模式,ios::app用于向末尾添加数据等。 所有这些也可以通过使用位OR运算符|组合,如下所示,

outFile.open("filename.txt",ios::out|ios::app);

IO中还有很多。我刚刚介绍了开始所需要的东西。

以下是您的问题的解决方案。试着理解它。

#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;



int main()
{ 
  ofstream outFile;
  ifstream inFile;
  char fileName[10],data[50];
  int noLines;

 cout<<"Enter Month:"<<endl;
 cin>>fileName;
 cout<<"Enter Number of lines you want to enter:"<<endl;
 cin>>noLines;

 outFile.open(fileName,ios::out);
 cout<<fileName<<"(Enter Data):";
 for(int i=0;i<=noLines;i++)
 {
  cin.getline(data,50);
  outFile<<data<<endl;
 }
 outFile.close();

 cout<<"Openening "<<fileName<<" :"<<endl;
 inFile.open(fileName,ios::in);
 for(int i=0 ;i<=noLines ;i++)
 {
  inFile.getline(data,50);
  cout<<data<<endl;
 }
 inFile.close();



 return 0; 
}

答案 1 :(得分:0)

OP已经找到了大部分解决方案:

string line;
while (getline(stream, line)) {
    if (line.find(token) != string::npos) {
        cout << line << endl;
    }
}
cout << token << " not found" << endl;

但是这只打印带有关键字的行。并始终打印&#34;未找到&#34;信息。糟糕!

相反,我推销:

string line;
bool found = false;
while (!found && getline(stream, line)) 
{ // search for keyword
    if (line.find(token) != string::npos)  
    {
        found = true; // found keyword. Stop looking
    }
}
if (found)
{ // print out all remaining lines in the file
    while (getline(stream, line)) 
    {
        cout << line << endl;
    }
}
else
{
    cout << token << " not found" << endl;
}

以上将令牌的发现和剩余文件的打印分为两个阶段以便于阅读。它可以压缩成一个循环,但有两个东西使它成为一个糟糕的赌注:

  1. 此程序将受IO限制。它将花费大部分时间来读取文件,因此很少有人将文件放入内存中进行调整是浪费时间。

  2. 组合循环需要在循环中添加逻辑,这样就可以使循环切换的成本相形见绌。

答案 2 :(得分:-1)

试试这个: http://www.cplusplus.com/doc/tutorial/files/ 还有这个: http://www.cplusplus.com/forum/beginner/14975/

关于用c ++读取和编写文件以及搜索文件。