Segmentation Fault Issue

Hello, I am trying to make a program that outputs all lines of code surrounded by "'s. I feel I have my algorithm for doing this, but my program keeps segfaulting. Here is the code:

#include <iostream>
// For file I/O:
#include <fstream>
#include <cstdlib>
#include <iomanip>

using namespace std;

// Prototype the count function so we can have it below it's first
// use in main().
void count(istream& in, int& lines, int& words, int& characters);
/*
* wc <filename>
*/

int main(int argc, char *argv[])
{
if (argc < 2) {
cerr << "Usage: wc <filename>" << endl;
return 0;
}
// Open the file specified by argv[1] for reading:
// Constructs a ifstream object called "in":
ifstream in(argv[1]);
// Was there a problem opening the file?
if (!in.good()) {
cerr << "Unable to open file [" << argv[1] << "] for reading." << endl;
return 1;
}

int lines = 0, words = 0, characters = 0;
count(in, lines, words, characters);
cout << setw(5) << lines << " " << words << " " << characters << " " << argv[1] << endl;
// Close the input stream:
in.close();
}

void count(istream& in, int& lines, int& words, int& characters)
{
int i;
char s;
int ch;
bool inword = false;

// Read until the end of file is reached, or there was an error:
//while (!in.eof()) {
// Read a character from the input stream "in":
// s = in.get(); //Set char s = in.get
//Loop to iterate through the characters
while (!in.eof() && (s = in.get()) != '"'); // read to first quote char
/* this is the word we want.. run to end quote marks.. */
while (!in.eof() && (s = in.get()) != '"') {
cout << s;
}
cout << endl;


if (in.good() == false) return;
characters++;
if (!isspace(ch) && !inword) {
inword = true;
words++;
} else if (isspace(ch) && inword) {
inword = false;
}
if (ch == '\n') lines++;
//}
}

You have numerous logic errors.

First one, or why .eof() is most certainly wrong in most situations:
1
2
3
while (!in.eof() //If we just read last character from a file, eof is not set, but there are no characters left
&& (s = in.get()) != '"'); //and that will assign garbage value to s and will set eof (too late)
//What if there was a failure in stream? .eof() will not catch this 
Correct loop would be:
1
2
char c;
while(in.get(c) && c != '"')


Second, or why there is a garbage in out values: Everything after your loops is not in loops.
Your function does following: find first ", output everything up until second ", do some calculations on uninitialized variable ch and return. No further reads are done.
Topic archived. No new replies allowed.