我有一个类似于此处发布的问题:
C++: Read from text file and separate into variable
不同之处在于原始帖子的file.txt格式如下:
我的文件格式如下:
fname lname
int int int
fname lname
int int int
我试图在(第一个和最后一个)中读取名称并将其存储到单个变量中,并将每个int存储到其自己的单独变量中(以供将来计算)。
我尝试过使用与答案类似的东西,但换行符会弄乱我的变量。
作为额外的奖励,我的档案中有随机的空行。
这是我到目前为止的代码
if (myfile.is_open())
{
while (getline(myfile, line))
{
istringstream iss(line);
string fname;
string lname;
if (line != "")
{
iss >> fname >> lname >> x >> y >> z >> a >> b >> c;
cout << "name: " << fname << endl;
//iss >> x >> y >> z >> a >> b >> c;
cout << "x: " << x << "y: " << y << endl;
}
else cout << "";
}
}
答案 0 :(得分:0)
你需要2行并打破变量读数。
iss >> fname >> lname >> x >> y >> z >> a >> b >> c; //don't know why you have 6 ints when you specified 3, I'll assume 6 is correct
变为
issFirstLine >> fname >> lname;
issSecondLine >> x >> y >> z >> a >> b >> c;
现在有多种方法可以做到这一点。 2个选项是:您可以尝试分别读取2行,只有在有2个非空行时才进行打印,或者您可以使用某种变量来确定您是在名称还是在行上,相应地打印,并在成功输出结束时更改预期类型。
答案 1 :(得分:0)
您可以使用freopen()
来读取文件。如果希望输入行之间有多个空行,则没有问题。
freopen("test.txt","r",stdin);
string fname;
string lname;
int x, y,z ,a ,b ,c;
while(cin>>fname){
cin>>lname>> x >> y >> z ;
//your other code
}
答案 2 :(得分:0)
这样的事情应该有用。
#include <stdio.h>
int main(int argc, char** argv) {
FILE *fin = fopen("in.txt", "r");
char fname[1024], lname[1024];
int x, y, z;
while (fscanf(fin, "%s %s %d %d %d", fname, lname, &x, &y, &z) == 5) {
printf("%s %s %d %d %d\n", fname, lname, x, y, z);
}
return 0;
}
答案 3 :(得分:0)
OP非常接近它会伤害。
我将通过引入一个有助于消除空白行的功能来建议简化:
istream & getNonBlankLine(istream & in,
string & line)
{
while (getline(in, line) && line.length() == 0)
{
//does nothing. If the loop didn't exit, line was blank
// if the loop exited, either we're out of lines or we got a valid line
// out of lines case is handled by testing the stream state on return
}
return in; // lets us chain and also lets us easily test the state of the stream
}
然后回到手头的工作:
if (myfile.is_open())
{
string nameline;
string numberline;
while (getNonBlankLine(myfile, nameline) &&
getNonBlankLine(myfile, numberline))
{ // got two non-blank lines and the stream is still good
//turn lines into streams
stringstream namess(nameline);
stringstream numberss(numberline);
// parse streams
if (namess >> fname >> lname && // read in first and last name or return error
numberss >> x >> y >> z) // read in x, y, and z or return error
{
// do stuff with input
}
else
{ //something did not read in correctly. Bad line
cerr << "invalid input"<< endl; // notify user and abort
return -1;
}
}
}
一个未经请求的更改是检查所有输入的有效性。如果输入不符合,OP的剪切和到目前为止的所有答案都将无声地失败。这必须在第一行有两个名字,在第二行有三个整数。任何其他应该触发无效的输入错误消息和提前退出。我说应该因为我还没有真正测试过这个。