ни один экземпляр перегруженной функции "getline" не соответствует списку аргументов - типы аргументов: (std :: ifstream, char) - PullRequest
0 голосов
/ 15 апреля 2020

начинающий пользователь C ++ здесь Я пытаюсь взять строки из файла и поместить его в массив строк. Файл имеет каждое слово в отдельной строке. Всякий раз, когда я проверял массив, он появлялся, загружая каждую букву в массив. Таким образом, это были символы вместо каждого слова в виде строки. Первая вещь в каждом файле - это число, которое будет размером массива. Я должен был динамически распределять массив, что я считаю, я сделал правильно. Любая помощь приветствуется. Я использую VScode, и проблема, которую дает мне getline, заключается в том, что ни один экземпляр перегруженной функции "getline" не соответствует списку аргументов - типы аргументов: (std :: ifstream, char).

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

   using namespace std;

   int showMenuGetChoice();
   string createStringArray(int);
   void getInfoFromUser(string, string, int);
   void printStory(int, string, int);

   // Calls all the other functions to make a working Madlibs game. 
 int main ()
 {
    int UserChoice;

    ifstream QuestionFile;
    int arraySize;
    string Question;
    int test = 0;
    do {

    cout <<"Let's Play some Madlibs!!" << endl << endl;
    UserChoice=showMenuGetChoice();

    if (UserChoice == 1)
    {
        ifstream QuestionFile;
        QuestionFile.open("starWars.txt");
        QuestionFile >> arraySize;
        cin.ignore();

        string QuestionArray=createStringArray(arraySize);

        if(QuestionFile.is_open())
        {
            QuestionArray[arraySize];

            for(int i=0; i < arraySize; i++)
            {
                getline(QuestionFile, QuestionArray[i]);
            }
        }
        for(int i=0; i < arraySize; i++)
        {
            cout << QuestionArray[i] << endl;
        }

      }

// Takes in a integer and creates a array of that size. Dynamically allocates the array and returns a point to this array.
string createStringArray(int n)
{
    string*QuestionArray = new string[n];

    return *QuestionArray;
}

1 Ответ

1 голос
/ 15 апреля 2020

Вы получаете сообщение об ошибке:

ни один экземпляр перегруженной функции "getline" не соответствует списку аргументов - типы аргументов: (std :: ifstream, char).

Из-за проблемы с вашим вызовом getline:

getline(QuestionFile, QuestionArray[i]);

std::getline принимает два параметра: ссылку std::istream и ссылку std::string. QuestionFile - это istream, так что ничего страшного, однако, если вы посмотрите объявление QuestionArray:

string QuestionArray=createStringArray(arraySize);

Вы должны заметить, что QuestionArray - это переменная типа string. Я не думаю, что это то, что вы хотели. Вы всегда должны тщательно выбирать тип переменных, которые вы объявляете в C ++, иначе вы работаете против безопасности типов, которую компилятор пытается вам предоставить.

i-й элемент строки QuestionArray - это char, а не string. Это является причиной ошибки компилятора. Вы пытаетесь поместить строку в один символьный элемент вместо строки.

Надеемся, что с вышеприведенным объяснением предоставленное сообщение компилятора теперь будет иметь больше смысла. Он предоставляет ту же информацию, чуть более сжатую.

С этим знанием давайте обратимся к функции createStringArray:

string createStringArray(int n)
{
    string*QuestionArray = new string[n];

    return *QuestionArray;
}

Вы объявляете функцию, возвращающую одну строку, когда Я ожидаю, что вы хотите, чтобы функция возвращала последовательность строк. Правильный способ вернуть последовательность строк - это использовать std::vector<std::string>, но если вам нужно рискованное, устаревшее, ручное управление памятью, вам нужно будет возвращать указатель на строку, а не строку из этого функция. Обладая этими знаниями, вы сможете исправить эту функцию, исходный тип переменной QuestionArray и ошибку компилятора на расстоянии go.

...