0

asmfile.txtという名前の次のファイルがあります

copy start 1000
read  ldx zero
      rd indev
rloop tix k100

このファイルから行ごとの入力を取得するために、次のコードを書きました....

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

//ここでの問題は、最初の 3 行が str に正常に入力されていることです...しかし、最後の行が str に入力されていません....コンソールでプログラムを実行すると表示されるため、これを知っています...

copy start 1000
read  ldx zero
rd indev

str[0]="rd" および str[1]="indev" のため、「rd indev」のインデントが変更されます.....4 行目が str に入力されていない理由を教えてください....

4

3 に答える 3

3

コードが失敗する理由について: while((c=in.get())!='\n')asmfile の最後の行に改行文字がない場合、無限ループに入ります。

i==2?i=0:i++;i++ に変更しint i=0;て while ループに移動し、asmfile を編集して、最後の行の後ろに改行文字が含まれるようにすると、コードが機能します。

とはいえ、ルネが提案したように、あなたは本当にそれをやるべきです. このようなコードは煩雑で、エラーが発生しやすくなります。

于 2011-09-23T14:59:20.633 に答える
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';
}
于 2011-09-23T14:04:42.097 に答える
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(); }
于 2011-09-23T14:05:24.223 に答える