C++ C++;程序结束而不是循环重复

C++ C++;程序结束而不是循环重复,c++,for-loop,crash,C++,For Loop,Crash,我正在为一个类分配编写一个程序,该程序使用3个不同的双哈希函数(so 1/1、1/2、1/3、2/1、2/2等)测试3个哈希函数,最终目标是按照我的说明,通过控制台命令“exename>results.txt”将每个配对的测试结果输出到一个文件中。我正在进行最终测试,但我的程序将进入main,完成一次嵌套for循环,输出第一个哈希函数对的测试结果,然后程序将无错误地结束。我已经和VisualStudio12的调试器打了好几个小时的交道,现在还没有找到一个解决方案。当我通过控制台运行程序时,它输出

我正在为一个类分配编写一个程序,该程序使用3个不同的双哈希函数(so 1/1、1/2、1/3、2/1、2/2等)测试3个哈希函数,最终目标是按照我的说明,通过控制台命令“exename>results.txt”将每个配对的测试结果输出到一个文件中。我正在进行最终测试,但我的程序将进入main,完成一次嵌套for循环,输出第一个哈希函数对的测试结果,然后程序将无错误地结束。我已经和VisualStudio12的调试器打了好几个小时的交道,现在还没有找到一个解决方案。当我通过控制台运行程序时,它输出“无法打开数据文件。程序终止”,即使在单步执行程序时,它从未进入过for循环。有什么想法吗?谢谢

另外,我知道本课程中使用的一些方法可能是非常规的,或者不一定是实现这一点的最简单/最好的方法,但我必须遵守我教授的标准

更新:我在getline for循环中添加了一个cout行,现在可以看到测试完成一次,然后下一次测试将重复该for循环41次并退出,而不是全部完成50次。看来我们有进展了

以下是我的输出:

1234567810111213141516171819202122232425262728293031323334353637338394041424344454647484950错误1 使用双哈希1测试哈希函数1。碰撞总数=360。 |||||||-------------------------------------|||||||||||||||-----|||||||||||||||--------|||||||||||||

1234567891011213141516171819202122232425262728293031323334353637338394041

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义表大小100
#定义密钥大小4
#定义EMPTYKEY“----”
#定义数据文件“P4DATA.txt”
使用名称空间std;
结构HashStruct
{
字符键[5];
int数据;
};
void InitTable(HashStruct hashT[],int TableSize);
int Hash_1(字符*键);
int Hash_2(字符*键);
int Hash_3(字符*键);
int ProbeDec_1(字符*键);
int ProbeDec_2(字符*键);
int ProbeDec_3(字符*键);
int HashInsert(HashStruct T[],char*key,int data,int hNum,int dhNum);
内部主(空){
int hashNum,dHashNum,count;
ifstream*infle;
HashStruct T[100];//100个数据结构的哈希表srray
字符行[64];//用于保存从文件读取的行的数组
char键[5];//用于保存4个字符键的数组
int data;//整数数据
字符文件名[15];
strcpy(文件名、数据文件);
for(hashNum=0;hashNum<3;hashNum++){
for(dHashNum=0;dHashNum<3;dHashNum++){
InitTable(T,TABLESIZE);
infle=新的ifstream();
填充->打开(文件名,ifstream::in);
如果(!infle->is_open()){
cout getline(第64行,“\n”);
sscanf(行“%s%d”、键和数据);
count+=HashInsert(T,key,data,hashNum,dHashNum);
}

cout这段代码中有很多错误的检查,我只想说一部分

for(int i = 0; i < 50; i++){
  inFile->getline(line, 64, '\n');
  sscanf(line, "%s %d", key, &data);
  count += HashInsert(T, key, data, hashNum, dHashNum);
}
for(int i=0;i<50;i++){
填充->获取行(第64行,“\n”);
sscanf(行“%s%d”、键和数据);
count+=HashInsert(T,key,data,hashNum,dHashNum);
}
第1+2行:太多的幻数,如果你混淆了50、64和4,你会得到错误

第3行:sscanf非常强大,但有点不安全,因为您不知道字符串的返回值有多长,一种方法是使字符串数组与读取行一样长

第2+3行返回值未选中

char key[MAXLineLength];
const int LinesToRead = 100; // your hash array is 100, but you read only 50
const int NUMFIELDS = 2;
const int ERROR = -1; // there is a system return somewhere that is more correct.

for(int i = 0; i < LinesToRead ; i++){
  inFile->getline(line, MAXLineLength, '\n');
  if (!inFile->good())
    return ERROR;
  if (NUMFIELDS != sscanf(line, "%s %d", key, &data))
    return ERROR;
  if (strlen(key)!=4)
    return ERROR;
  count += HashInsert(T, key, data, hashNum, dHashNum);
}
char键[MAXLineLength];
const int LinesToRead=100;//您的哈希数组是100,但您只读取了50
常量int NUMFIELDS=2;
const int ERROR=-1;//在更正确的地方有一个系统返回。
对于(int i=0;igetline(line,MAXLineLength,“\n”);
如果(!infle->good())
返回误差;
if(NUMFIELDS!=sscanf(第%s%d行、键和数据))
返回误差;
如果(strlen(键)!=4)
返回误差;
count+=HashInsert(T,key,data,hashNum,dHashNum);
}

请访问StAccOffFuff.com。请花些时间阅读,特别是命名的部分。请同时。请最后学习如何创建A。请阅读,并学习一些原因,您的问题可能被否决。最后,请考虑。考虑到您的C++与C的糟糕组合,我建议您正确地学习C++。一些程序员这就是我的教授要求我们编写代码的方式,我们不允许使用STL,必须将字符串作为字符数组来实现。他已经80岁了。多少次碰撞中有360次碰撞?这是正确的吗?为什么50和64会导致错误?50只是我文件中的数据行数,我不明白为什么要重复这个for循环50次会导致问题。你能解释一下吗?这段代码的大部分都是由我的导师提供的,包括你指出的。行列式数组设置为64个字符,这就是为什么getline函数中有64个字符的原因。我确实看到,现在我已经实现了这些检查,在检查infle->好的。我应该去哪里寻找原因呢?我是一个初学者,还有很多东西要学。我很抱歉。问题是,当你以后将50改为100时,你必须找到所有你当时写了50到100的地方,当你将值存储在常数中时,更容易控制。你很可能有一个F结尾ile(eof),您可以检查该特定错误。如果您只有50行,并且将LinesToRead设置为100,您将获得eof,因此将其更改为应该的值。
char key[MAXLineLength];
const int LinesToRead = 100; // your hash array is 100, but you read only 50
const int NUMFIELDS = 2;
const int ERROR = -1; // there is a system return somewhere that is more correct.

for(int i = 0; i < LinesToRead ; i++){
  inFile->getline(line, MAXLineLength, '\n');
  if (!inFile->good())
    return ERROR;
  if (NUMFIELDS != sscanf(line, "%s %d", key, &data))
    return ERROR;
  if (strlen(key)!=4)
    return ERROR;
  count += HashInsert(T, key, data, hashNum, dHashNum);
}