我是c ++和编程的新手,所以在我的问题重复中提前抱歉。我有一个3行的文本文件:
7
00000000000000000000000 * 0000
0 0 0 R 0
我需要做的是读取第二行并将其作为char写入数组。但我不能包括第3行,因为它会进入一个完全不同的矩阵。到目前为止我的代码:
ifstream input;
input.open("input1.txt");
input >> start;
char a=0;
string line;
while (getline(input, line))
{
a=0;
istringstream iss(line);
int length = line.size();
for (int i=0; i<length; i++)
{
iss >> a;
A[i] = a;
cout << A[i] << " " << i << endl;
}
}
input.close();
但是,使用此代码,它始终为第3行启动新数组。我究竟做错了什么?修复它的最简单方法是什么?谢谢。
-----------------------------更新----------------- ---------------------
我修改了代码,但仍然无法正常工作。我得到了这样的结果:5)-└而不是正确的结果。我目前的代码:
void Read(int &numLines, int &start, vector<char>&A, char B[][5])
{
ifstream input;
input.open("input.txt");
input >> start;
input.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
string line;
if(getline(input, line))
{
for(char temp: line)
{
A.push_back(temp);
}
}
input.close();
}
A
这里是我要写第二行的矢量,char是char
Start
只是一个整数,我在其中存储第一行(7)
非常感谢您的建议
答案 0 :(得分:0)
混合>>
和std::getline
并非易事。例如,在input >> start;
之后,行结束标记将留在流中,以防仍然需要。在你的情况下它不是,它被随后的getline
调用取消,导致读取空行。
这使您对line
的读取变得复杂,并迫使while
循环并测试空行。
使用development environment's debugger逐步完成您的计划,您将看到我在说什么。习惯使用调试器。它可能是您遇到的最佳编程生产力工具。
解决问题的最简单方法是放置
input.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
之后
input >> start;
占用该行的末尾(以及可能在该行上的任何其他内容。这需要添加#include<limits>
才能获得std::numeric_limits<std::streamsize>::max
。
然后你可以删除while循环并用
替换它if (getline(input, line))
没有循环,不能从文件中消耗多行。阅读和处理第三行的逻辑可以遵循。
旁注:代替for
循环,请考虑
int i = 0;
while (iss >> a)
{
A[i] = a;
cout << A[i] << " " << i << endl;
i++;
}
这将在iss
前进,直到它到达终点。您也可以完全抛出iss
,直接从line
中读取字符。
int i = 0;
for(char temp: line)
{
A[i] = temp;
}
A
如果还没有降低缓冲区溢出的可能性,那么它应该是vector
。
for(char temp: line)
{
A.push_back(temp);
}
答案 1 :(得分:0)
我会选择这样的东西:
std::string start;
std::string Astring;
ifstream input;
input.open("input.txt");
input >> start;
input >> Astring;
// If you really want a char array
char * A = new char[Astring.size()];
for (unsigned int i = 0; i < Astring.size(); i++) {
A[i] = Astring[i];
}
// Don't forget to delete after use
delete[] A;
此外,如果您稍后需要将char数组作为其他内容的输入,则可以调用Astring.c_str()
而不是for
循环,这将返回C样式的char数组。