我的代码需要帮助。我试图读取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;
}
}
答案 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;
}
}