1. ホーム
  2. c

[解決済み] C言語で、テキストファイルを読み込んで、すべての文字列を表示するにはどうすればよいですか?

2022-03-04 20:36:52

質問

という名前のテキストファイルがあります。 test.txt

このファイルを読み込んで、内容をコンソールに表示するCプログラムを書きたい(ファイルにはASCIIテキストしか含まれていないものとする)。

文字列変数のサイズを取得する方法がわかりません。こんな感じ。

char str[999];
FILE * file;
file = fopen( "test.txt" , "r");
if (file) {
    while (fscanf(file, "%s", str)!=EOF)
        printf("%s",str);
    fclose(file);
}

サイズ 999 が返す文字列はうまくいきません。 fscanf はそれよりも大きくなることがあります。 どうすれば解決できますか?

どのように解決するのですか?

一番簡単な方法は、文字を読んで、読んだ直後に印刷する方法です。

int c;
FILE *file;
file = fopen("test.txt", "r");
if (file) {
    while ((c = getc(file)) != EOF)
        putchar(c);
    fclose(file);
}

cint 上記のように EOF は負の数であり、プレーンな char は、もしかしたら unsigned .

ファイルをチャンク単位で読み込むが、動的メモリ割り当てを行わない場合は、以下のようになります。

#define CHUNK 1024 /* read 1024 bytes at a time */
char buf[CHUNK];
FILE *file;
size_t nread;

file = fopen("test.txt", "r");
if (file) {
    while ((nread = fread(buf, 1, sizeof buf, file)) > 0)
        fwrite(buf, 1, nread, stdout);
    if (ferror(file)) {
        /* deal with error */
    }
    fclose(file);
}

上記の2番目の方法は、基本的に動的に割り当てられた配列でファイルを読み込む方法です。

char *buf = malloc(chunk);

if (buf == NULL) {
    /* deal with malloc() failure */
}

/* otherwise do this.  Note 'chunk' instead of 'sizeof buf' */
while ((nread = fread(buf, 1, chunk, file)) > 0) {
    /* as above */
}

のメソッドを使用します。 fscanf()%s というフォーマットは、ファイルの空白に関する情報を失ってしまうので、正確にはファイルを stdout .