为什么会进入死循环呢?该如何处理
为什么会进入死循环呢?
#pragma warning ( disable: 4786 )
#include <iostream>
#include <string>
#include <fstream>
#include <map>
using namespace std;
map <string,double> probabilityMap;
//void InputProbability()
int main()
{
ofstream outputProbability;
string outputProbabilityFile( "copyOutputProbability.txt ");
ifstream inputProbability;
string inputProbabilityFile( "outProbabilityFile.txt ");
inputProbability.open ( inputProbabilityFile.c_str ());
if ( !inputProbability )
{
cerr < < "error: unable to open the input file! " < <endl;
return -1;
}
else
{
while ( !inputProbability.eof () )
{
string word;
if ( inputProbability > > word )
{ //probabilityMap[word]++;
double num;
if ( inputProbability > > num )
{
probabilityMap[word] = num ;
}
}
}
// while ( )
inputProbability.close();
}
outputProbability.open(outputProbabilityFile.c_str ());
if ( !outputProbability )
{
cerr < < "unable to open output file! " < <endl;
return -2;
}
typedef map <string, double> ::iterator typeIter;
for ( typeIter it=probabilityMap.begin (); it!=probabilityMap.end (); ++it )
{
outputProbability < < (*it).first < < " " < < endl;//(*it).second < <endl;
}
outputProbability.close();
return 0;
}
------解决方案--------------------
没看出来
UP
------解决方案--------------------
这段有问题:
while ( !inputProbability.eof () )
{
string word;
if ( inputProbability > > word )
{ //当文件中的格式不是 string double的时候,就会出错。
//出错时,这里就设置了标志位,就导致一直死循环;
//你的outProbabilityFile.txt文件格式
//肯定不是字符串 浮点数 .....的格式
double num;
if ( inputProbability > > num )
{
probabilityMap[word] = num ;
}
}
}
inputProbability.close();
}
可以改成如下就不会死循环了,只是个变通的办法:
while ( !inputProbability.eof () )
{
string word;
if(inputProbability.fail())
inputProbability.clear();
if ( inputProbability > > word )
{ //probabilityMap[word]++;
double num;
if ( inputProbability > > num )
{
probabilityMap[word] = num ;
}
}
}
// while ( )
inputProbability.close();
}
------解决方案--------------------
没问题。
outProbabilityFile
本 23
传真 14
回复 32
解说 12
如果 10
商 20
商品 40
市 21
我 18
我们 14
一 14
#pragma warning ( disable: 4786 )
#include <iostream>
#include <string>
#include <fstream>
#include <map>
using namespace std;
map <string,double> probabilityMap;
//void InputProbability()
int main()
{
ofstream outputProbability;
string outputProbabilityFile( "copyOutputProbability.txt ");
ifstream inputProbability;
string inputProbabilityFile( "outProbabilityFile.txt ");
inputProbability.open ( inputProbabilityFile.c_str ());
if ( !inputProbability )
{
cerr < < "error: unable to open the input file! " < <endl;
return -1;
}
else
{
while ( !inputProbability.eof () )
{
string word;
if ( inputProbability > > word )
{ //probabilityMap[word]++;
double num;
if ( inputProbability > > num )
{
probabilityMap[word] = num ;
}
}
}
// while ( )
inputProbability.close();
}
outputProbability.open(outputProbabilityFile.c_str ());
if ( !outputProbability )
{
cerr < < "unable to open output file! " < <endl;
return -2;
}
typedef map <string, double> ::iterator typeIter;
for ( typeIter it=probabilityMap.begin (); it!=probabilityMap.end (); ++it )
{
outputProbability < < (*it).first < < " " < < endl;//(*it).second < <endl;
}
outputProbability.close();
return 0;
}
------解决方案--------------------
没看出来
UP
------解决方案--------------------
这段有问题:
while ( !inputProbability.eof () )
{
string word;
if ( inputProbability > > word )
{ //当文件中的格式不是 string double的时候,就会出错。
//出错时,这里就设置了标志位,就导致一直死循环;
//你的outProbabilityFile.txt文件格式
//肯定不是字符串 浮点数 .....的格式
double num;
if ( inputProbability > > num )
{
probabilityMap[word] = num ;
}
}
}
inputProbability.close();
}
可以改成如下就不会死循环了,只是个变通的办法:
while ( !inputProbability.eof () )
{
string word;
if(inputProbability.fail())
inputProbability.clear();
if ( inputProbability > > word )
{ //probabilityMap[word]++;
double num;
if ( inputProbability > > num )
{
probabilityMap[word] = num ;
}
}
}
// while ( )
inputProbability.close();
}
------解决方案--------------------
没问题。
outProbabilityFile
本 23
传真 14
回复 32
解说 12
如果 10
商 20
商品 40
市 21
我 18
我们 14
一 14