此代码有什么问题? 我试图在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;
}
答案 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 documentation,ifstream::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 ++文件处理中必须学习的最基础知识。