从文件中获取输入

时间:2011-09-23 13:40:46

标签: c++ file file-io file-processing

我有以下名为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>

3 个答案:

答案 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(); }