0
int main()
{
    int i;
    FILE *list,*file;
    char temp[30];
    list=fopen("filelist","rb");
    while(fgets(temp,30,list)!=NULL)
    {
        file=fopen(temp,"r");
    {
    fclose(list);
    return 0;
}

これは私のコードですが、基本的にはファイルリスト内のすべてのファイルを開きたいのですが、私の fopen 呼び出しです (ただし、最初の呼び出しは常に NULL を返します

file1
file2
file3
file4

また、ファイル拡張子を使用せず、ファイルは実行可能ファイルと同じディレクトリに存在します。

4

3 に答える 3

2

fgets()は改行文字をそれが取り込んでいるバッファーに格納するため、fopen()内で呼び出す前に改行文字を削除する必要がありますwhile

のリンクされた参照ページからfgets()

指定されたファイル ストリームから最大で count - 1 文字を読み取り、それらを str に格納します。生成される文字列は常に NULL で終了します。ファイルの終わりが発生した場合、または改行文字が見つかった場合、解析は停止します。この場合、 str にはその改行文字が含まれます

改行を削除するコード例:

char* nl = strrchr(temp, '\n');
if (nl)  *nl = 0;
于 2012-12-16T11:34:24.013 に答える
1

fgets 文字列の最後に改行を残します。これは、後で次の行を追加するとはっきりとわかります。

printf ("[%s]\n", temp);

次のように表示されます。

[file1
]

使用する前に削除する必要があります。これは、次のような方法で行うことができます。

size_t sz = strlen (temp);
if (sz > 0)
    if (temp[sz-1] == '\n')
        temp[sz-1] = '\0';

この効果は、次の完全なプログラムで実際に確認できます。

#include <stdio.h>
#include <string.h>

int main (void) {
    size_t sz;
    char temp[30];

    printf ("\n> ");
    while (fgets (temp, sizeof(temp), stdin) != NULL) {
        printf ("before: [%s]\n", temp);
        sz = strlen (temp);
        if (sz > 0) {
            if (temp[sz-1] == '\n') {
                temp[sz-1] = '\0';
            }
        }
        printf ("after : [%s]\n", temp);
        printf ("\n> ");
    }
    return 0;
}

基本的には正確な方法を使用してfgets(ただし標準入力から)行を取得し、末尾の改行を削除する前後の両方で結果を出力します。サンプルの実行は次のとおりです。

pax> ./testprog

> hello
before: [hello
]
after : [hello]

> goodbye
before: [goodbye
]
after : [goodbye]

> [CTRL-D]

pax> _

また、そのコード セグメントの他のいくつかのことを確認することもできます。

  • ループ{の終わりでの開き中括弧の使用。while
  • ループ内でファイルを開き、それらに対して何もしていないという事実 (ファイルを閉じることを含む)。
  • "rb"オープンモードの使用。通常、これは不要です。テキスト ファイルであることがわかっている場合は、もちろん不要です。
  • 失敗する可能性のある関数 ( など) の戻りコードは、使用する前に常に確認する必要がありfopenます。
  • main引数を必要としない Cの正規形は ですint main (void)
于 2012-12-16T11:34:43.410 に答える