C ++计算文件中的单词出现并写入另一个文件

时间:2014-03-15 09:26:03

标签: c++ file

此代码有什么问题? 我试图在input.txt中搜索单词TID input.txt中 -

TID TID  TID:fjkcgbkn

它只在output.txt中显示0

#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
int main()
{
int con=0;
ifstream fi;
fi.open("input.txt");
char word[3];

  while(!fi.eof())
  {
     fi.get(word,3,' ');
     if (strcmp(word,"TID") == 0)
        con++;
  }
  fi.close();

ofstream fo;
fo.open ("output.txt");
fo<<con<<"\n";
fo.close();
return 0;
}

4 个答案:

答案 0 :(得分:2)

是因为当你使用这样的引号时:

"TID"
内存中的

像这样保存

TID\0

其中\ 0是字符串结尾的标记。

您可以在结尾'\ 0'添加变量word并且它应该有效(将大小更改为4:)

答案 1 :(得分:2)

两件事:

首先,word必须长4个字节才能保存ifstream::get读取的空终止符:

char word[4];

其次,传递给fi.get()的缓冲区大小必须更新为匹配:

fi.get(word,4,' ')

As per documentationifstream::get(char*,streamsize,char)最多会读取n-1个字符,然后附加一个空终结符。这将让您读取完整的3个字符串及其终结符。 (使用sizeof(word)代替4也是一种选择;它允许您更改word的大小,而无需修改任何其他内容。)

请注意,您仍然会为"abTID TID"这样的字符串生成不正确的结果,这些字符串首先会显示"abT"然后"ID"。算法的必要改进留给读者练习。

答案 2 :(得分:1)

这是一种方式(未经测试,但应该有效):

#include <iterator>
#include <fstream>
#include <iomanip>

using namespace std;

ifstream fin("input.txt");
ofstream fout("output.txt", std::ios::trunc);
fin >> noskipws;
istream_iterator<string> iter(fin), end;
ostream_iterator<string> iter_out(fout);

int count = 0;
copy_if(iter, end, iter_out, [&count](string const & val) -> bool 
 { if (val == "TID") {
       ++count;
       return true;
   }
   return false;
});

答案 3 :(得分:1)

对函数 get()进行修改,必须使用函数 getline()

它将解决\ 0 null字符的问题。

这些是您在C ++文件处理中必须学习的最基础知识。