C++ Program Ending Rather Than Repeating For Loop

Multi tool use
Multi tool use
The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP


C++ Program Ending Rather Than Repeating For Loop



I am writing a program for a class assignment that tests 3 hashing functions with 3 different double hash functions (so 1/1, 1/2, 1/3, 2/1, 2/2, etc.), and the end goal is to output the test results of each pairing to a file via console command "exename > Results.txt" as per my professors instructions. I'm reaching final testing but my program will go into main, complete the nested for loop once, output the test results of the first hash function pairing, then the program ends with no error. I have messed with Visual Studio 12's debugger for hours and am no closer to finding a solution than I was when I started. When I run the program via console, it outputs "Unable to open data file. Program terminating", even though when stepping through the program it never once enters that for loop. Any ideas? Thanks!



P.S. I'm aware that some methods used in this program may be unconventional or not necessarily the easiest/best way to implement this, but I'm required to confine to my professor's standards.


#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <string.h>

#define TABLESIZE 100
#define KEYSIZE 4
#define EMPTYKEY "----"
#define DATAFILE "P4DATA.txt"

using namespace std;

struct HashStruct
{
char key[5];
int data;
};

void InitTable(HashStruct hashT, int TableSize);
int Hash_1(char *key);
int Hash_2(char *key);
int Hash_3(char *key);
int ProbeDec_1(char *key);
int ProbeDec_2(char *key);
int ProbeDec_3(char *key);
int HashInsert(HashStruct T, char *key, int data, int hNum, int dhNum);

int main(void){

int hashNum, dHashNum, count;
ifstream *inFile;
HashStruct T[100]; // Hash table srray of 100 data structures
char line[64];// Array to hold lines read from file
char key[5]; // Array to hold 4-character keys
int data; // Integer data
char filename[15];

strcpy(filename, DATAFILE);

for(hashNum = 0; hashNum < 3; hashNum++){
for(dHashNum = 0; dHashNum < 3; dHashNum++){
InitTable(T, TABLESIZE);
inFile = new ifstream();
inFile->open(filename, ifstream::in);
if(!inFile->is_open()){
cout << "Unable to open data file. Program terminatingn";
return 0;
}

count = 0;
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);
}

cout << "Testing hash function " << hashNum + 1 << " using double hash " << dHashNum + 1 << ".n";
cout << "Total collisions = " << count << ".n";
for(int i=0; i < 100; i++){
if(strcmp(T[i].key, EMPTYKEY))
cout << "|";
else
cout << "-";
}
cout << "nn";
inFile->close();
delete inFile;
}
}
return 1;
}

int HashInsert(HashStruct T, char *key, int data, int hNum, int dhNum){
int testNum = (hNum * 3) + dhNum;
int colCount = 0;
int hashIndex, probeDec;

switch(testNum){
case 0 : // Hash function 1 -- Double hash 1 (linear probing)
hashIndex = Hash_1(key);
probeDec = ProbeDec_1(key); // Function just returns 1
break;
case 1 : // Hash function 1 -- Double hash 2
hashIndex = Hash_1(key);
probeDec = ProbeDec_2(key);
break;
case 2 : // Hash function 1 -- Double hash 3
hashIndex = Hash_1(key);
probeDec = ProbeDec_3(key);
break;
case 3 : // Hash function 2 -- Double hash 1 (linear probing)
hashIndex = Hash_2(key);
probeDec = ProbeDec_1(key); // Function just returns 1
break;
case 4 : // Hash function 2 -- Double hash 2
hashIndex = Hash_2(key);
probeDec = ProbeDec_2(key);
break;
case 5 : // Hash function 2 -- Double hash 3
hashIndex = Hash_2(key);
probeDec = ProbeDec_3(key);
break;
case 6 : // Hash function 3 -- Double hash 1 (linear probing)
hashIndex = Hash_3(key);
probeDec = ProbeDec_1(key); // Function just returns 1
break;
case 7 : // Hash function 3 -- Double hash 2
hashIndex = Hash_3(key);
probeDec = ProbeDec_2(key);
break;
case 8 : // Hash function 3 -- Double hash 3
hashIndex = Hash_3(key);
probeDec = ProbeDec_3(key);
break;
}

while(strcmp(T[hashIndex].key, EMPTYKEY) != 0){
colCount++;
hashIndex -= probeDec; // Decrementing was chosen you could also choose to
if(hashIndex < 0) // increment and wrap back to the beginning of the table.
hashIndex = hashIndex + TABLESIZE;
}

strcpy(T[hashIndex].key, key);
T[hashIndex].data = data;
return colCount;
}

void InitTable(HashStruct hashT, int TableSize){
int i;

for(i=0; i<TableSize; i++){
strcpy(hashT[i].key, EMPTYKEY);
hashT[i].data = 0;
}
}

int Hash_1(char *key){
int hash = 0;
int prime = 29;
int index = 0;

for(int i = 0; i < 4; i++){
hash = (key[i]-'0')*prime;
for(int j = (3-i); j > 0; j--){
hash *= prime;
}
}

index = hash % TABLESIZE;
return index;
}

int Hash_2(char *key){ // Folding
int hash = 0;
int index = 0;

hash = (((key[0]-'0')+(key[1]-'0'))*37) +
(((key[1]-'0')+(key[2]-'0'))*47) +
(((key[2]-'0')+(key[3]-'0'))*67);

index = hash % TABLESIZE;
return index;
}

int Hash_3(char *key){ //Middle Squaring
int hash = 0;
int index = 0;

hash = ((key[1]-'0') + (key[2]-'0'));
hash *= hash;
index = hash % TABLESIZE;
return index;
}

int ProbeDec_1(char *key){
return 1;
}

int ProbeDec_2(char *key){
int dhash = 0;
int index = 0;

dhash = ((key[0]-'0')*97) + ((key[1]-'0')*83);
index = dhash % TABLESIZE;
return index;
}

int ProbeDec_3(char *key){
int dhash = 0;
int index = 0;

dhash = (((key[0]-'0')*29) + ((key[1]-'0')*59) +
((key[2]-'0')*79) + ((key[3]-'0')*89));
index = dhash % TABLESIZE;
return index;
}





Welcome to stackoverflow.com. Please take some time to read the help pages, especially the sections named "What topics can I ask about here?" and "What types of questions should I avoid asking?". Also please take the tour and read about how to ask good questions. Lastly please learn how to create a Minimal, Complete, and Verifiable Example.
– Some programmer dude
6 mins ago





Also please read this question checklist, and all of idownvotedbecau.se to learn some reasons your question might be down-voted. Finally, please learn how to debug your programs.
– Some programmer dude
6 mins ago





And considering your bad mix of C++ with C, I suggest you get a few good books to learn C++ properly.
– Some programmer dude
4 mins ago





@Someprogrammerdude this is how my professor requires we write our code, we aren't allowed to use the STL and must implement strings as character arrays. He's like 80 years old.
– Alex McGowan
2 mins ago









By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

RtzJJg7SoLO
7iMl0IwbwQAA F,JdJGl oQfZjp N f0txzPK Em Ic061xES 1tuMylcreXndMNnp VjQ1t4y6zoZnxqPhM58wr,7,ng p

Popular posts from this blog

Makefile test if variable is not empty

Visual Studio Code: How to configure includePath for better IntelliSense results

Will Oldham