-1

初学者 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;
}
4

1 回答 1

1

您收到错误消息:

没有重载函数“getline”的实例与参数列表匹配——参数类型为:(std::ifstream,char)。

由于您的“getline”调用存在问题:

getline(QuestionFile, QuestionArray[i]);

std::getline接受两个参数,一个std::istream引用和一个std::string引用。QuestionFileistream,所以没关系,但是如果您查看 的声明QuestionArray

string QuestionArray=createStringArray(arraySize);

您应该注意到 QuestionArray 是一个string类型变量。我不认为这是你想要的。您应该始终谨慎地选择您在 C++ 中声明的变量类型,否则您将违背编译器试图为您提供的类型安全性。

字符串的第ith 个元素QuestionArray是 a char,而不是 a string。这是编译器错误的原因。您试图将该行放入单个字符元素而不是字符串中。

希望通过上述解释,提供的编译器消息现在会更有意义。它提供了相同的信息,只是更简洁一些。

有了这些知识,让我们来解决这个createStringArray功能:

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

    return *QuestionArray;
}

当我希望函数返回字符串序列时,您声明该函数返回单个字符串。返回字符串序列的正确方法是使用std::vector<std::string>,但如果您必须使用有风险的、过时的手动内存管理,则需要返回指向字符串的指针,而不是来自此函数的字符串。有了这些知识,您应该能够更正这个函数、原始QuestionArray变量类型和编译器错误应该消失。

于 2020-04-15T03:59:16.837 回答