使用strtok_s显示文本文件中的文本

时间:2014-03-13 17:26:54

标签: c++ string vector text-files strtok

我是C ++的初学者,我试图通过使用带有strtok_s的标记将文本放入文本文件的向量中。

我只能将一个文本推回并显示在向量中,我确信在编码中存在一些问题。

以下是代码:

    std::vector<char> myVector;
    ifstream myReadFile;
    myReadFile.open("E:/C++/Projects/Textfile project/Textfile project/class_data.txt", ios_base::in); 
    char output[100];
    if (myReadFile.is_open()) {
        while (!myReadFile.eof()) {
            myReadFile >> output;
        }

    }
    myReadFile.close();

    char* token = NULL;
    char* context = NULL;
    char delims[] = " ,\t\n";


    token = strtok_s(output, delims, &context);

    while (token != NULL)
    {
        if (token != NULL) 
        {
            myVector.push_back(token);
            token = strtok_s(NULL, delims, &context);

        }
    }

    for (int i = 0; i < myVector.size(); i++) {
        cout << myVector[i] << endl;
    }

我试图从文本文件中取出文本,将其分成单独的部分并将它们放入字符向量中。

谁能告诉我我做了什么错误?抱歉没有专业编码,我是一名学习C ++的高中生。

编辑后的代码:

std::vector<std::string> myVector;
    ifstream myReadFile;
    myReadFile.open("E:/C++/Projects/Textfile project/Textfile project/class_data.txt", ios_base::in); 
    char output[100];
    if (myReadFile.is_open()) {
        while (!myReadFile.eof()) {
            myReadFile >> output;

            char* token = NULL;
            char* context = NULL;
            char delims[] = " ,\t\n";

            token = strtok_s(output, delims, &context);

            while (token != NULL)
            {
                myVector.push_back(token);
                token = strtok_s(NULL, delims, &context);
            }
        }
    }
    myReadFile.close();

    for (int i = 0; i < myVector.size(); i++) {
        cout << myVector[i] << endl;
    }

1 个答案:

答案 0 :(得分:2)

您需要定义std::vector<char> myVector;

类型的对象向量,而不是char std::string类型的对象向量。
std::vector<std::string> myVector;

本声明

myVector.push_back(token);

无效,因为您尝试按指针而不是字符。

while循环中的if语句

while (token != NULL)
{
    if (token != NULL) 
    {
        myVector.push_back(token);
        token = strtok_s(NULL, delims, &context);

    }
}

是superflouos,可以删除

while (token != NULL)
{
    myVector.push_back(token);
    token = strtok_s(NULL, delims, &context);

}

还要考虑到这个循环

    while (!myReadFile.eof()) {
        myReadFile >> output;
    }

始终覆盖对象输出。您应该将此循环与将输出分割为标记的循环结合起来。否则,您正在处理文件的最后一条记录。