Error reading file, maybe EOF problem

I am writing a small search engine program. The simplest and least important portion of my code has a bug I cannot fix.

The code reads words from a text file, stores each word, the position of the word in the file, and the beginning and end of the sentence where the word is found.

All is good until reaching the last line. I find the position of the first word, beginning/end of the sentence (wordPos, startSentence & endSentence) but it looks like the fstream object "iFile" gets released before reading in the words. I am not positive but Xcode gives an "EXC_BAD_ACCESS" error which I have found to mean I am attempting to manipulate an object that has gone out of scope. FYI, the code is basic and does not require Xcode.

I put some additional comments in my code to point to areas of concern. The algorithm is included in the code. I added a section to check whether iFile.tellg() == -1 to see if the fstream object was released but that does not appear to be the case.

I would also appreciate any other general comments about my code.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/**
 *  Programmer: fryeguy
 *  Program: TxtCrawl for MicroSearch
 *
 *  Algorithm:
 *  TxtCrawl is the component of MicroSearch that reads text
 *  documents for search terms and stores them for
 *  indexing
 *
 *  1. Count words in doc, then initialize
 *     wordsFromDoc array to wordCount
 *  2. Initiate output file for writing.
 *  3. Open input file for reading words.
 *  4. Until reaching EOF:
 *     4.a. Set value for start "get pointer" in startSentence (.tellg()).
 *     4.b. Store value for end "get pointer" in endSentence (.tellg()).
 *     4.c. Reset "get pointer" to startSentence location.
 *     4.d. Until reaching endSentence, Read into the
 *          array theWord, wordPos, startSent, and endSent
 *  5. Write wordsFromDoc array to file
 *  6. When EOF is reached close the files.
 */

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>	

using namespace std;

struct wordProps		// stores word info to be placed in array
{
	string	theWord;	// stores the word
	int		wordPos;	// stores the position of word
	int		startSent;	// stores the start point of the sentence
	int		endSent;	// stores the end point of the sentence
};

void countWords(string, int&, int&);

int main()
{
	
	ifstream iFile; // file stream for reading in data
	ofstream oFile; // file stream for writing data
	
	string	iFileName = "TextFile2.txt";	// name of test file to read from
	string	oFileName = "OutputFile.txt";	// name of test file to write to
	string	aLine = "";						// stores a line preceeding a newline character (\n)
	string	aWord = "";						// stores words from doc for indexing
	int		charCount = 0;					// count of characters in doc
	int		wordCount = 0;					// count of words in doc
	int		aLineWordCount = 0;				// count of words in a single line being processed
	int		wordBegin = 0;					// stores location of word in doc
	int		startSentence = 0;				// stores pointer value for start of sentence
	int		endSentence = 0;				// stores pointer value for end of sentence
	
	/**
	 * 1. Count words in doc, then initialize
	 *    wordsFromDoc array to wordCount
	 */
	countWords(iFileName, charCount, wordCount);
	cout << "charCount: " << charCount << endl; // DEBUG CODE
	cout << "wordCount: " << wordCount << endl; // DEBUG CODE
	wordProps wordsFromDoc[wordCount];
	cout<< "length of array: " << (sizeof(wordsFromDoc) / sizeof(*wordsFromDoc)) << endl;  // DEBUG CODE
	
	/**
	 * 2. Initiate output file for writing
	 */
	oFile.open (oFileName.c_str()); // setup output file and write header
	oFile << setw(20) << left << "File Name: " << iFileName << endl;
	oFile << setw(20) << "---------------------------------------" << endl << endl;
	
	/**
	 * 3. Open input file for reading words
	 */
	iFile.open (iFileName.c_str());
	if (!iFile.is_open())
		cout << "No such file exists!" << endl;
	else
	{
		/**
		 * 4. Until reaching EOF:
		 */
		// I have been attempting different counting methods assuming the eof was being reached prematurely
		// The results really have not varied with this code
		// while (iFile.tellg() != charCount) 
		while (!iFile.eof())
		{
			//cout << "count: " << count << endl;
			/**
			 * 4.a. Set value for start "get pointer" in startSentence (.tellg()).
			 */
			startSentence = iFile.tellg();
			cout << "startSentence: " << startSentence << endl; // DEBUG CODE
			
			/**
			 * 4.b. Store value for end "get pointer" in endSentence (.tellg()).
			 */
			getline(iFile, aLine, '.');
			cout << aLine << endl; // DEBUG CODE
			endSentence = iFile.tellg();
			aLine.clear();
			cout << "endSentence: " << endSentence << endl; // DEBUG CODE
			
			if (!iFile.is_open())
			{
				cout << "The if, iFile.tellg(): " << iFile.tellg() << endl; // DEBUG CODE
				iFile.close();
				iFile.open (iFileName.c_str());
			}
			
			/**
			 * 4.c. Reset "get pointer" to startSentence location.
			 */
			iFile.seekg(startSentence);
			cout << "iFile.tellg(): " << iFile.tellg() << endl; // DEBUG CODE
			
			/**
			 * 4.d. Until reaching endSentence, Read into the
			 *      array theWord, wordPos, startSent, and endSent
			 */
			 
			 // As the last line is about to be read there is an error of some sort.
			 // My guess is that somehow I exceed the end of the file but my startSentence
			 // and endSentence variables are pointing where I think they should.
			
			for ( ; iFile.tellg() < endSentence; aLineWordCount++)
			{
				wordsFromDoc[aLineWordCount].wordPos = iFile.tellg();
				cout << "wordPos: " << wordsFromDoc[aLineWordCount].wordPos << endl; // DEBUG CODE
				iFile >> wordsFromDoc[aLineWordCount].theWord;
				cout << "theWord: " << wordsFromDoc[aLineWordCount].theWord << endl; // DEBUG CODE
				wordsFromDoc[aLineWordCount].startSent = startSentence;
				cout << "startSent: " << wordsFromDoc[aLineWordCount].startSent << endl; // DEBUG CODE
				wordsFromDoc[aLineWordCount].endSent = endSentence;
				cout << "endSent: " << wordsFromDoc[aLineWordCount].endSent << endl << endl; // DEBUG CODE
				cout << "aLineWordCount: " << aLineWordCount << endl;
			} // end for
			
		} // end while !=iFile.eof
			
			// THIS section of code is never reached because of the hang up above.
			/**
			 * 5. Write wordsFromDoc array to file
			 */
			for (int count = 0; count < aLineWordCount; count++)
			{
				oFile << setw(20) << left
				<< wordsFromDoc[count].theWord << " "
				<< wordsFromDoc[count].wordPos << " "
				<< wordsFromDoc[count].startSent << " "
				<< wordsFromDoc[count].endSent << endl;
			}

	} // end else
	
	/**
	 * 6. When EOF is reached close the files.
	 */
	iFile.close();
	oFile.close();

// DEBUG CDODE for verifying results
//	for (int count = 0; count < wordCount; count++) {
//		cout << "theWord: " << wordsFromDoc[count].theWord << endl;
//		cout << "wordPos: " << wordsFromDoc[count].wordPos << endl;
//		cout << "startSent: " << wordsFromDoc[count].startSent << endl;
//		cout << "endSent: " << wordsFromDoc[count].endSent << endl << endl;
//	}
	
}

/**
 * Implement countWords function
 */
void countWords(string theFileName, int &charCount, int &wordCount)
{
	string	theWord = "";
	char	theChar = ' ';
	fstream inFile;
	
	//count the chars
	inFile.open (theFileName.c_str());
	if (!inFile.is_open())
		cout << "No such file exists!" << endl;
	else
	{
		inFile.get(theChar);
		while (!inFile.eof())
		{
			charCount++;
			inFile.get(theChar);
		}
	}
	inFile.close();
	
	// count the words
	inFile.open (theFileName.c_str());
	if (!inFile.is_open())
		cout << "No such file exists!" << endl;
	else
	{
		while (!inFile.eof())
		{
			inFile >> theWord;
			wordCount++;
		}
	}
	inFile.close();
}

Last edited on
Topic archived. No new replies allowed.