Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Ok, the code does now seem like it works as expected:</p> <pre><code>#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace::std; struct Node { string fileName; Node *link; }; bool contains (Node *&amp;flist, string &amp;name) { Node *tempNode = *&amp;flist; while (tempNode != 0) { cout &lt;&lt; "Searching in \"" &lt;&lt; flist-&gt;fileName; cout &lt;&lt; "\" for \"" &lt;&lt; name &lt;&lt; "\"" &lt;&lt; endl; if ( tempNode-&gt;fileName == name) { return true; } else { tempNode = tempNode-&gt;link; } } return false; } Node* getLastNode (Node *&amp;flist) { Node *tempNode = *&amp;flist; while (tempNode != 0) { tempNode = tempNode-&gt;link; } return tempNode; } string getFileName(string oneLine) { char doubleQuote; doubleQuote = oneLine[9]; if (doubleQuote == '\"') { string sub = oneLine.substr(10); //getting the file name string::size_type n = sub.size(); sub = sub.substr(0,n-1); return sub; } return ""; } void process( istream &amp;in, ostream &amp;out, Node *&amp;flist ) { cout &lt;&lt; "Start of process: " &lt;&lt; flist-&gt;fileName &lt;&lt; endl &lt;&lt; endl; string oneLine; while (1) { cout &lt;&lt; "Input include statement: "; getline(in, oneLine); if (oneLine == "STOP") return; string::size_type loc = oneLine.find("#include",0); if (loc != string::npos) { //found one line starting with "#include" string name; name = getFileName(oneLine); if (name == "") { cout &lt;&lt; "Couldn't find filename, skipping line..." &lt;&lt; endl; continue; } if (contains(flist, name)) { //contains recursive include cerr &lt;&lt; "Uh, oh! Recursive include of file " &lt;&lt; name &lt;&lt; endl; exit(-1); } else { cerr &lt;&lt; "No recursive include" &lt;&lt; endl; } }//if cout &lt;&lt; endl; }//while } int main( int argc, char *argv[] ) { Node* fileList = new Node; istream *infile = &amp;cin; // default value ostream *outfile = &amp;cout; // default value fileList-&gt;fileName = "Input"; // default value switch ( argc ) { case 3: outfile = new ofstream( argv[2] ); // open the outfile file if ( outfile-&gt;fail() ) { cerr &lt;&lt; "Can't open output file " &lt;&lt; argv[2] &lt;&lt; endl; exit( -1 ); } // FALL THROUGH to handle input file case 2: infile = new ifstream( argv[1] ); // open the input file if ( infile-&gt;fail() ) { cerr &lt;&lt; "Can't open input file " &lt;&lt; argv[1] &lt;&lt; endl; exit( -1 ); } else { fileList-&gt;fileName = argv[1]; cout &lt;&lt; "in main: " &lt;&lt; fileList-&gt;fileName &lt;&lt; endl; } // FALL THROUGH case 1: // use cin and cout break; default: // too many arguments cerr &lt;&lt; "Usage: " &lt;&lt; argv[0] &lt;&lt; " [ input-file [ output-file ] ]" &lt;&lt; endl; exit( -1 ); // TERMINATE! } process(*infile, *outfile, fileList); // do something if ( infile != &amp;cin ) delete infile; // close file, do not delete cin! if ( outfile != &amp;cout ) delete outfile; // close file, do not delete cout! } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload