Вектор структур Vector и String не печатается правильно - PullRequest
1 голос
/ 13 декабря 2011

Я - начинающий студент C ++ и пытаюсь написать программу, которая берет слово в файле и индексирует его, перечисляя каждое слово только один раз и отображая номера строк при каждом появлении этого слова.Я пытался использовать карту, но я не смог получить номера строк для слов.Вместо этого я использую вектор структур, который имеет целочисленный вектор и строку для каждого слова.Я пытаюсь прочитать каждое слово, поместить его в поток строк, а затем вывести его в строку в структуре.Затем я беру номер строки и вставляю его в вектор в структуре.затем я сохраняю все в векторе структуры и пытаюсь распечатать каждое слово, связанное с вектором номера строки.Я ничего не получаю и хотел бы помочь.Это будет высоко ценится!Вот мой исходный код:

#include <iostream>
#include <string>
#include <fstream>
#include <map>
#include <sstream>
#include <vector>
using namespace std;



 struct words {
 vector<int> lineNumbers;
 string word;

};

int main() {
ifstream inFile, testStream;
ofstream outFile; 
string temp, choice, inFileName, outFileName, word, trash, word2, tempString; 
int idx = 0, count = 0, idxTwo = 0;
bool outputOpened = false;
//map <string,int> wordList;    
/map <string,int>::iterator wordIt;     
stringstream myStream(ios_base::in| ios_base::out); 

vector<words> myIndex; 
words data; 



for (;;) {  
    cout << "Options: "<< endl << "1. Index" << endl << "2. Quit" << endl 
    << "Please enter an option: ";
    getline(cin, temp);
    //cin >> temp;
    //cin.ignore(8192, '\n');
    choice.resize(temp.length());
    transform(temp.begin(), temp.end(), choice.begin(), ::toupper);
    if (choice.compare("INDEX") == 0 || choice.compare("1") == 0) {
        do {
            inFileName.clear();
            cout << "Index Program" << endl
            << "==============" << endl << endl;
            cout << "Input file name: ";
            getline(cin, inFileName);
            inFile.open(inFileName.c_str());
            if(inFile.fail()) {
                cout << "Can't open file" << endl;
                if(inFile.bad()) {
                    cout << "Bad" << endl;
                }
                inFile.clear();
            }
        }
        while (!inFile.is_open());
        do {
            cout << "Output file name: ";
            getline( cin, outFileName);
            testStream.clear();
            testStream.open(outFileName.c_str());
            if(testStream.good()) {
                cout << "That file already exists, try again" <<         endl;
                testStream.clear();
                testStream.close();
            }
            else {
                testStream.clear();
                testStream.close();
                outFile.open(outFileName.c_str());
                if (outFile.good()) {
                    outputOpened = true;
                }
            }
        }
        while (!outputOpened);

        while (getline(inFile, trash)){

            count++;
            myStream << trash; 
            //myStream >> tempString; 

            while(myStream >> data.word) {

                data.lineNumbers.push_back(count);
                myIndex.push_back(data);
            }
        }
        for (idx = 0; idx < myIndex.size(); idx++) {
            outFile << "Word: "<< " "<< myIndex[idx].word << ", ";
            for (idxTwo = 0; idxTwo < myIndex[idx].lineNumbers.size(); idxTwo++) {
                outFile << "Found on lines " << " " << myIndex[idx].lineNumbers[idxTwo];
            }
        }
        inFile.close();
        outFile.close();
    }
    else if (choice.compare("QUIT") == 0 || choice.compare("2") == 0) {
        return 0;
    }
    else {
        cout << temp << " is an unrecognized option, please try again" << endl;
    }
}
return 0;

}

Ответы [ 3 ]

0 голосов
/ 13 декабря 2011

Ваша проблема в том, что вы всегда добавляете каждое слово к vector<words>.

То, что вы, вероятно, хотите, это map<string, vector<int>>.Используйте .insert для вставки слов в набор, если он уже существует, просто добавьте текущий номер строки к значению.

0 голосов
/ 13 декабря 2011

Вот некоторые проблемы:

Добавьте myStream.clear(); после цикла while(myStream >> data.word).

Добавьте "\ n" в конец следующей строки для печати на новой строке:

outFile << "Found on lines " << " " << myIndex[idx].lineNumbers[idxTwo]<<"\n";

Кроме того, следующий вложенный цикл не даст вам правильных результатов.Он будет расти с номерами строк и будет продолжать печатать «Найдено в строках»:

for (idx = 0; idx < myIndex.size(); idx++) {
outFile << "Word: "<< " "<< myIndex[idx].word << ", ";
  for (idxTwo = 0; idxTwo < myIndex[idx].lineNumbers.size(); idxTwo++) {
     outFile << "Found on lines " << " " << myIndex[idx].lineNumbers[idxTwo]<<"\n";
    }
0 голосов
/ 13 декабря 2011

Для этой части вашей программы:

    while (getline(inFile, trash)){
        count++;
        myStream << trash; 
        //myStream >> tempString; 
        while(myStream >> data.word) {
            // 2.
            // data.lineNumbers.clear();
            data.lineNumbers.push_back(count);
            myIndex.push_back(data);
        }
        // 1. add:
        // myStream.clear();
    }
  1. Вы используете глобальный myStream.Но состояние этой myStream будет в плохом состоянии после обработки каждой строки, так как в ней закончились данные.Необходимо очистить состояние, чтобы оно снова заработало.

  2. data также является глобальным, что делает номер строки для каждого слова, которое будет сохранено в data.lineNumber, а не толькономер строки текущего слова.Вы можете очистить его при каждом запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...