2012-01-16 9 views
2

こんにちは私はfseekを実行した後にファイルの残りの内容を印刷しようとしています。今すぐ返されるものは何も得られません。私のコードに何が問題なのですか?C:シーク後にファイルの内容を印刷する方法

#include <stdio.h> 

int main(int argc, char *argv[]){ 
    FILE *fr; 

    if (fr = fopen (argv[1], "r")){ 
    fseek(fr, 100, SEEK_CUR); 

    char c[1]; 
    while (fread(c, 1, sizeof(c),fr) > 0) 
     printf("%s", c); 

    fclose(fr); 
    } 
    else{ 
    perror("File does not exist"); 
    } 

} 

答えて

2

他の回答が指摘したように、printfにはNULLで終了しない文字列を渡しています。また、読み取っているファイルが100バイトを超えていることを確認していません。最後の1つは、fread()size_t sizesize_t nitersのパラメータを入れ替えたことです。

#include <stdio.h> 
#include <sys/stat.h> 

int main(int argc, char *argv[]) 
{ 
    FILE *fr; 
    char c[1]; 
    struct stat sb; 

    // obtains information about the file 
    if (stat(argv[1], &sb) == -1) 
    { 
     perror("stat()"); 
     return(1); 
    }; 

    // verifies the file is over 100 bytes in size 
    if (sb.st_size < 101) 
    { 
     fprintf(stderr, "%s: file is less than 100 bytes\n", argv[1]); 
     return(1); 
    }; 

    // opens the file, or prints the error and exists 
    if (!(fr = fopen (argv[1], "r"))) 
    { 
     perror("fopen():"); 
     return(1); 
    }; 

    fseek(fr, 100, SEEK_CUR); 

    while (fread(c, sizeof(c), 1, fr) > 0) 
     printf("%c", c[0]); 

    fclose(fr); 

    return(0); 
} 

ます。また、何かの行にchar c[1];を変更することで、ファイルを読み込むの効率を向上させることができます:ここで

は、上記の問題(と間隔ビットをクリーンアップを)修正プログラムの修正版ですchar c[1024];とにwhile文を更新:

while (fread(c, sizeof(char), 1023, fr) > 0) 
    { 
     c[1023] = '\0'; 
     printf("%s", c); 
    }; 
+0

一度に1バイト以上を読み込んでからprintfを使用すると、入力ファイルはNULL文字のないテキストファイルであることが前提です。 –

0

あなたがバイトを読んだが、NULLで終わる文字列を期待%s、とそれを印刷しようとしています。それを%cに変更してください(もちろん、c*cという形式の文字列と一致するように!)修正する必要があります。 %s指定子が出力されます絶対に何も(それはあなたが繰り返し空の文字列を印刷することを求めていると考えると)とあなたが読んバイトの値が0に等しい場合は特に

printf

+0

extract.c:30:警告:フォーマット '%cが' 'INT' と入力期待しますが、引数2 'のchar *' そのエラーANの取得を入力していますそれでもまだ何も表示されない – SuperString

+0

@SuperString: 'c'を' * c'に変更する必要があるので、それは書式指定子と一直線になる。また、 '%d 'で' * c'を印刷してみてください。おそらくnullバイトですか? – Jon

1

%sで印刷することはできません。文字列はnullで終了する必要があります。文字は1文字のみです。 使用:

 printf("%c",*c); 

ないすべての文字がない印刷可能とされているかを確認するためにascii tableを確認し、印刷可能です。 0を印刷すると画面に何も印刷されません。AFAIK

+0

はまだ印刷されていません – SuperString

0

printf("%s",blabla)はヌルで終了する文字列を出力します。 1文字の印刷にはprintf("%c",c[0])を使用してください。

関連する問題