我有以下名为asmfile.txt的文件
copy start 1000
read ldx zero
rd indev
rloop tix k100
为了从该文件中获取linewise输入,我编写了以下代码....
void aviasm::crsymtab()
{
ifstream in(asmfile,ios::in);//opening the asmfile
in.seekg(0,ios::beg);
char c;
string str[3];
string subset;
long locctr=0;
int i=0;
while((c=in.get())!=EOF)
{
in.putback(c);
str[0]="";
str[1]="";
str[2]="";
while((c=in.get())!='\n')
{
in.putback(c);
in>>str[i];
i==2?i=0:i++; //limiting i to 2....
}
cout<<str[0]<<" "<<str[1]<<" "<<str[2]<<endl;
}
in.close();
}
//现在的问题是前三行被成功输入到str ...但是最后一行没有输入到str ....我知道这是因为在控制台上运行程序时我看到了。 ..
copy start 1000
read ldx zero
rd indev
'rd indev'缩进更改因为str [0] =“rd”和str [1] =“indev”..... plz告诉我为什么第四行没有输入到str .... / p>
答案 0 :(得分:3)
我不知道逐个字符地读取文件并将它们放回流中的目的是什么。这条线
string str[3];
将字符串str[0]
定义为str[2]
。写入不存在的str[3]
是未定义的行为。更清洁的方法是
std::ifstream in(asmfile);
std::vector<std::string> lines;
std::string line;
while (std::getline(in, line))
{
lines.push_back(line);
}
之后lines.size()
给出成功读取的行数。
for (size_t i = 0; i < lines.size(); ++i)
{
std::cout << i << " : " << lines[i] << '\n';
}
答案 1 :(得分:3)
至于为什么你的代码失败:while((c=in.get())!='\n')
在asmfile的最后一行没有换行字符时进入无限循环。
将i==2?i=0:i++;
更改为i ++并在while循环中移动int i=0;
,编辑asmfile以使其在最后一行后面有一个换行符并且代码可以正常工作。
那就是说,你真的应该像Rene所说的那样做。像这样的代码很混乱,容易出错。
答案 2 :(得分:0)
我在调试代码时遇到问题,因为我不了解您的意图 - get()
和pushback()
来电的处理方式是什么?因此,让我重写您的代码,而不是回答您的直接问题:
#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
const char * asmfile("/tmp/asm.txt");
void crsymtab()
{
std::ifstream in(asmfile); // opening the asmfile
std::string line;
while(std::getline(in, line)) {
std::istringstream sline(line);
std::string str[3];
if(sline.peek() == ' ')
sline >> str[1] >> str[2];
else
sline >> str[0] >> str[1] >> str[2];
std::cout << str[0] << " " << str[1] << " " << str[2] << "\n";
}
}
int main() { crsymtab(); }