读取txt文件并将每行放入差异Vector中。 C ++

时间:2018-01-14 12:03:26

标签: c++

我的代码需要帮助。我试图读取txt文件,然后我想把每一行放入差异向量。例如,我有一个这样的文件。

123, 123, 431, 5123, 12312
25316, 64234, 1231, 124123

我想把第一行放到第一个向量中。 123 | 123 | 431 | 和第二个向量。 25316 | 64234 |

我已经尝试过了。但是,它不起作用。最好的方法是什么?稍后,我将使用这些向量与Linkedlist。

这是我的代码。

#include <iostream>
#include <fstream>
#include <stdlib.h>

using namespace std;

int main()
{
    string fname;
    cout << "Please enter file name!" << endl;
    cin >> fname;

    string line;
    fstream myfile;
    myfile.open(fname);

    if (myfile.is_open())
    {
        myfile.seekg(0, ios_base::end);
        int length = myfile.tellg();

        cout << length <<endl;
    }
    else
    {
        cout << "Unable to open your file!" << endl;
    }
}

1 个答案:

答案 0 :(得分:0)

首先,单独处理这些行:

  • 如其他人所述,您不应使用std::basic_istream::seekg()。它适用于streambuf中的绝对位置,并且需要为您的用例提供更多代码而不必要(您必须在流中找到换行符,拆分等)。

  • 使用getline()。

示例:

if (myfile.is_open())
{
    short line_num = 1;
    for (std::string line; std::getline(myfile, line); ) {
        cout << "Line number: " << line_num << " Value: " << line << std::endl;
        line_num++;
    }
}

<强>输出:

mindaugasb@c_cpp:~/workspace/StackOverflow/ReadingAFileLineByLine $ ./r2v.exe 
Please enter file name!
f
Line number: 1 Value: 123, 123, 431, 5123, 12312
Line number: 2 Value: 25316, 64234, 1231, 124123

第二次将行,项目一次推送到向量:

我将假设输入文件中的两行会有两个向量。如果有更多行,则需要创建更多向量,可能通过实现一个将接受为字符串的函数(从输入文件中获取)并以您想要的形式返回向量。例如:

vector<string> line2Vec(string line)
{
    char * tokens;
    char * line_chararr = const_cast< char *>(line.c_str());   
    tokens = strtok(line_chararr, ", ");
    vector<string> vs;

    while (tokens != NULL)
    {
        vs.push_back(tokens);
        tokens = strtok (NULL, ", ");
    }

    return vs;
}

注意 - 我不是说这是完美的Cpp代码或是您问题的完美解决方案。然而,这是我如何根据所写内容理解问题的解决方案。以下是完整版:

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <sstream>
#include <vector>
#include <string.h>

using namespace std;

vector<string> line2Vec(string line)
{
    cout << line << endl;

    char * tokens;
    char * line_chararr = const_cast< char *>(line.c_str());   
    tokens = strtok(line_chararr, ", ");

    vector<string> vs;

    while (tokens != NULL)
    {
        vs.push_back(tokens);
        tokens = strtok (NULL, ", ");
    }

    return vs;
}

int main()
{
    string fname;
    cout << "Please enter file name!" << endl;
    cin >> fname;

    fstream  myfile;
    myfile.open(fname);

    if (myfile.is_open())
    {
        for (std::string line; std::getline(myfile, line); ) {
            line2Vec(line);
        }
    }
    else
    {
        cout << "Unable to open your file!" << endl;
    }
}