开发者

Why doesn't this code run?

Hey, sorry if this is asked a lot but I have no idea what the problem here is.

In the C++ code below, I'm reading from a user defined input file and generating output. I've been writing it piece by piece and putting it together, compiling, testing, etc as I go to work out the bugs. This is a learning experience for me, first self-directed program I guess...

Anyways, when I run the code, the command prompt prints ONE line and goes unresponsive. I would say it has been caught in some kind of loop, but I believe that's impossible.

I think it might have something to do with the array I'm trying to declare, I wanted to make a dynamic string array but I found out that's difficult...

#include <iostream>
#include <fstream>
#include <algorithm>
#include <cctype>
#include <string>
using namespace std;

int wordCount(string line)
{
    int fpos, fpos2; 
    int count = 0;
    fpos = line.find_first_not_of(' ');
    line.erase(0, fpos);

    while(line.size() > 0)
    {
        fpos = line.find_first_of(' ');
        if(line.at(0) == '"')
        {
            line.erase(0, 1);     
            for(int i = 0; i <line.size(); i++)
            if(line.at(i) == '"' && line.at(i-1) != '\\')
            {
                fpos2 = i;
                break;
            }
        line.erase(0, fpos2 + 2);
        }
            else
            line.erase(0, fpos + 1);
            count++;
    }


return count;
}

int main()
{
  //Current line; Input file; Output file;
string currentline, fileName, outFileName;

ifstream fin;
ofstream fout;

cout << "Enter input file name: ";
getline(cin, fileName);
cout << "Enter output file name: ";
getline(cin, outFileName);

fin.open(fileName.c_str());
if (!fin.good()) throw "I/O error";
fout.open(outFileName.c_str());
if (!fout.good()) throw "I/O error";
getline(fin, currentline);

while (!开发者_如何学Gocurrentline.empty())
{

    int pos, pos1;


    pos = currentline.find("//");
    string postScript = currentline.substr(pos+2,-1);
    pos = currentline.find_first_of(';');
    string xline = currentline.substr(0,pos+1);
    cout << xline << endl;

    int size = wordCount(xline);
    string *words;
    words = (string *) malloc (size*sizeof(string));
    words = new string[size];
    pos = xline.find_first_not_of(' ');
    xline.erase(0, pos);        

    for ( int i = 0; i < size; i++ )
    {
        pos = xline.find_first_of(' ');
        if ( xline.at(0) == '"' )
        {
            xline.erase(0, 1);    
            for(int a = 0; a < xline.size(); a++) //This for loop finds the end of a quoted statement within the line.
                if ( xline.at(a) == '"' && xline.at(a-1) != '\\' )
                {
                    pos = a;
                    break;
                }
            words[i] = xline.substr(0,pos);
            xline.erase(0,pos + 2);
        }
        else
        {
            words[i] = xline.substr(0,pos);
            xline.erase(0,pos + 1);
        }
        cout << words[i] << endl;
    }
    cout << xline << endl << endl;

    getline(fin, currentline);
}

  return 0;
}


I would suggest you commenting out bits of code until it starts to work the way you expect (Usually the problematic bit will become obvious this way.) Once you figure out what is wrong you can ask a more specific question on StackOverflow.


You should use a debugger to investigate the program behavior.

To avoid single stepping the whole program, you can set breakpoints where you expect to passs the sequence. When a breakpoint is not hit you can use single stepping from the previous point. Additionally you can look at variables content.


It never finds the end quote:

if ( xline.at(a) == '"' && xline.at(a-1) != '\\' )
{
  pos = a;
  break;
}

Try this instead:

if (xline.at(a) == '"')
{
  pos = a;
  break;
}

You only need to escape " if its contained in a string literal, e.g. "There's a \" in this literal"

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜