-2

行番号を付けながら、標準入力からテキストを入力して画面に表示したい。read()プログラムの最後の部分が機能しません。関数を正しく使用する方法がわかりません。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <io.h>
#include <string.h>

int main()
{
    char s[201];
    int i=0, f = open("text.dat", O_RDWR | O_CREAT | O_TRUNC);
    while (fgets(s,200,stdin) != NULL)
        write(f,s,strlen(s));
    char *buf;
    while (read(f,buf,200) > 0)
        printf("%d %s", i++, *buf);
    close(f);
    return 0;
}
4

2 に答える 2

2

まず第一に、あなたは消費しますstdin

while (fgets(s,200,stdin) != NULL)
    write(f,s,strlen(s));

次に、ファイルから読み取ろうとしますf。ただし、ファイルfは既に末尾にあるため、最初の呼び出しは をread()返します0。読むものがないので。ファイル ポインタをファイルの先頭に戻す必要があります。

しかし、あなたのread()ベースループはまだあなたが望むことをしません。これは、行指向の入力が必要なためです。したがって、fgetsではなくを使用する必要がありますread。行指向の方法で処理したのと同じ方法でstdin、印刷を処理する必要がありますstdout

Mats が指摘しているように、buf を割り当てたことはありません。したがって、読み取るものがあれば、初期化されていないポインターを逆参照することになります。

以上のことをすべて言いましたが、単一のループだけを実行する方が理にかなっているように思えます。を呼び出すprintf()ループ内で呼び出しますwrite()

while (fgets(s,200,stdin) != NULL)
{
    write(f,s,strlen(s));
    printf("%d %s", i, s);
    i++;
}
于 2012-12-26T16:41:08.940 に答える
0

奇妙な出力: 私は、この部分がかなりひどくクラッシュすると思っていたでしょう:

char *buf;
while (read(f,buf,200) > 0)
    printf("%d %s", i++, *buf);

buf は何にも初期化されていないため、「あそこ」を指します(「どこにも役に立たない」という一般的な方向)。これにより、Linux/Unix システムで SIGSEGV (「セグメンテーション フォールト」) が発生することが予想されます。万が一、DOS で Turbo/Borland C を使用していない場合は、これがクラッシュしないと想像できる唯一のシナリオです。Windows は SIGSEGV とは言いませんが、それでもコードは機能しません。

もちろん、ファイルの最後にいるという事実によって救われるかもしれません。つまり、何も読まないということです。

おそらくあなたはこれを意味しました:

char buf[200];
while (read(f,buf,200) > 0) ....
于 2012-12-26T17:14:56.137 に答える