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

C++ C++;从一个文件中计算单词的出现次数并写入另一个文件,c++,file,C++,File,这段代码有什么问题? 我正在尝试在input.txt中搜索单词TID input.txt- 工业贸易署 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]

这段代码有什么问题? 我正在尝试在input.txt中搜索单词TID input.txt-

工业贸易署 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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
int con=0;
IFFI;
fi.open(“input.txt”);
字符字[3];
而(!fi.eof())
{
fi.get(字,3,”);
如果(strcmp(字,“TID”)==0)
con++;
}
fi.close();
流fo;
fo.open(“output.txt”);

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

"TID"
内存是这样保存的

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


您可以在变量“\0”的末尾添加word
,它应该可以工作(将大小更改为4:)

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

"TID"
内存是这样保存的

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

您可以在“\0”末尾添加变量
word
,它应该可以工作(将大小更改为4:)

这里有一种方法(未测试,但应该可以工作):

#包括
#包括
#包括
使用名称空间std;
ifstream fin(“input.txt”);
流fout(“output.txt”,std::ios::trunc);
fin>>noskipws;
istream_迭代器iter(fin),结束;
ostream_迭代器iter_out(fout);
整数计数=0;
复制if(iter,end,iter,out,[&count](字符串const&val)->bool
{如果(val==“TID”){
++计数;
返回true;
}
返回false;
});
这里有一种方法(未经测试,但应该可以使用):

#包括
#包括
#包括
使用名称空间std;
ifstream fin(“input.txt”);
流fout(“output.txt”,std::ios::trunc);
fin>>noskipws;
istream_迭代器iter(fin),结束;
ostream_迭代器iter_out(fout);
整数计数=0;
复制if(iter,end,iter,out,[&count](字符串const&val)->bool
{如果(val==“TID”){
++计数;
返回true;
}
返回false;
});
两件事:

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

char word[4];
其次,必须更新传递给
fi.get()
的缓冲区大小以匹配:

fi.get(word,4,' ')
ifstream::get(char*,streamsize,char)
将最多读取
n-1个
字符,然后附加一个空终止符。这将允许您读取完整的3个字符串及其终止符。(使用
sizeof(word)
而不是
4
也是一个选项;它允许您更改
word
的大小,而无需修改任何其他内容。)

请注意,您仍然会为字符串(如
“abTID TID”
)生成不正确的结果,这些字符串将首先读取
“abT”
,然后读取
“ID”
。算法的必要改进留给读者作为练习。

两件事:

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

char word[4];
其次,必须更新传递给
fi.get()
的缓冲区大小以匹配:

fi.get(word,4,' ')
ifstream::get(char*,streamsize,char)
将最多读取
n-1个
字符,然后附加一个空终止符。这将允许您读取完整的3个字符串及其终止符。(使用
sizeof(word)
而不是
4
也是一个选项;它允许您更改
word
的大小,而无需修改任何其他内容。)


请注意,您仍然会为字符串(如
“abTID TID”
)生成不正确的结果,这些字符串将首先读取
“abT”
,然后读取
“ID”
。算法的必要改进留给读者作为练习。

对于函数get(),您必须使用函数getline()

它将解决\0空字符的问题


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

< P>警告函数<强> GET()>强>,必须使用函数<强> GETLILE()< <强> > /P> 它将解决\0空字符的问题


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

是的,至少你需要调整代码< Word < /C> >到[4 ]。,因为没有空终止符“\0”的空间。只需添加它就可以了。此代码不是很灵活…如果需要将分隔符更改为其他内容,您的代码将不再工作。您通常实现一个状态机并逐个字符检查:)你的代码也没有在VS中为我完成运行,它被卡在一个无限循环中。你需要检查
fi.good()
,而不是
!fi.eof()
。是的,你至少需要将
word
调整为[4],因为没有空终止符“\0”的空间。只需添加它就可以了。此代码不是很灵活…如果需要将分隔符更改为其他内容,您的代码将不再工作。您通常实现一个状态机并逐个字符检查:)您的代码也没有在VS中为我完成运行,它被卡住了在无限循环中。您需要检查
fi.good()
,而不是
!fi.eof())
。这当然是一种解决方法,但它不能直接解决或解释OP看到的错误。我投票支持你。你的观点是正确的。但我想说明一个解决方案,因为他最终想做的就是这样。@JasonC它通过删除错误来解决错误,这是一件好事:标准库为你提供了工具这使得犯简单错误变得更加困难,从我这里知道这些是很好的。+1。这当然是一种方法,但它不能直接解决或解释OP看到的错误。我投票支持你。你的观点是正确的。但我想说明一个解决方案,因为他到底想做的是这些。@JasonC它通过removi解决错误这是一件好事:标准库为您提供了使您更难犯简单错误的工具,了解这些很好