1

私は実際にそのようなテキストファイルのアセンブラファイルを持っています

1         # Test case 1 for assembler
2                 
3                   .text
4    test1:          lwa   $1,val1
5                    prh   $1
6    val12:          lwa   $2,val2
7                    prh   $2
         ..................

fgets を使用して各行を読み取り、「linebuffer」という名前の char バッファーに保持し、sscanf を使用して linebuffer を読み取ります。

while((fgets(linebuffer,sizeof(linebuffer),ifp)!=NULL)
{
sscanf(linebuffer,"%s%s%s%s",line[i].label,line[i].opcode,line[i].operands,line[i].comment);
......
} 

そして、それらを構造体に保持したい、

struct instrucion{
char lable[8];
char opcode[4];
char opearand[15];
char comment[100];
}line[65536];

問題は、一部の列にスペースだけがなく、sscanf がスペースをスキップし、次の文字列を読み取って最初の列に保持することです。申し訳ありませんが、正確に理解できませんでしたが、誰かが理解してくれることを願っています。

たとえば、3行目はそのようにしたいです。

line[2].label=NULL
line[2].opcode=".text"
line[2].opernds=NULL
line[2].comment=NULL

4行目;

line[3].label="test1:"
line[3].opcode="lwa"
line[3].operands="$1,val1"
line[3].comment=NULL

問題は5行目から始まっています

line[4].label=NULL
line[4].opcode="prh"
line[4].operands="$1"
line[4].comment=NULL

しかし、コードを実行すると、この結果が得られます。

line[4].label="prh"
line[4].opcode="$1"
line[4].opernds=NULL
line[4].comment=NULL

このラインバッファを正しく区別するにはどうすればよいですか?

4

1 に答える 1

1

OK、最初の問題は、fgets() が 1 行を読み取らないことです。これは sizeof(linebuffer) バイト数まで読み取られます。man ページはこちらで確認できます: http://linux.die.net/man/3 /取得

次に、文字列「linebuffer」に 1 行しかない場合、sscanf の戻り値を使用して、行に表示されるトークンを特定します (scanf 関数ファミリーは、行から読み取られたパラメーターの数を返します)。ストリーム)。

第 3 に、scanf はスペースと改行のみをトークン区切り文字と見なすため、文字列 "$1,val1" を 2 つの部分文字列に分けないことに注意してください。手動で行う必要があります。

最後に、おそらく作業を楽にしてくれる文字列解析関数 strtok_r があります。ここでマニュアルページを見ることができます: http://linux.die.net/man/3/strtok_r

アムノン。

于 2013-04-10T08:00:50.673 に答える