2

現在、指定された 8 ビット バイトが指定されたファイルに何回出現するかをユーザーに通知するプログラムを作成しようとしています。

いくつかの基本的な作業がレイアウトされていますが、ファイルが配列またはバッファー、またはバイトをチェックするためにファイルデータを入れる必要がある形式に確実に収まるようになると、おそらく非常に遠いと感じます正しい方法を使用しないでください。

その後、指定されたバイトに対してファイルデータが入れられるものを確認する必要がありますが、これを行う方法もわかりません。私はこれをかなり複雑にしすぎているのではないかと思うので、変更が必要なこと、または完全に破棄できることを説明していただければ幸いです。

うまくいけば、重要な詳細を省略しませんでした。

すべてが実行されているように見えます (このコードはコンパイルされます) が、最後に最後のステートメントを出力しようとすると、ステートメントが吐き出されません。最終的な for ループをまったく正しく設定しなかったような気がします..

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
//#define BUFFER_SIZE (4096)
main(int argc, char *argv[]){       //argc = arg count, argv = array of arguements

    char buffer[4096];
    int readBuffer;
    int b;
    int byteCount = 0;
    b = atoi(argv[2]);
    FILE *f = fopen(argv[1], "rb");

    unsigned long count = 0;
    int ch;

    if(argc!=3){                 /* required number of args = 3 */

        fprintf(stderr,"Too few/many arguements given.\n");
        fprintf(stderr, "Proper usage: ./bcount path byte\n");
        exit(0);
    }

    else{                       /*open and read file*/
        if(f == 0){
            fprintf(stderr, "File could not be opened.\n");
            exit(0);
        }



    }

    if((b <= -1) || (b >= 256)){            /*checks to see if the byte provided is between 0 & 255*/
        fprintf(stderr, "Byte provided must be between 0 and 255.\n");
        exit(0);
    }
    else{
        printf("Byte provided fits in range.\n");
    }

    int i = 0; 
    int k;
    int newFile[i];

    fseek(f, 0, SEEK_END);
    int lengthOfFile = ftell(f);


    for(k = 0; k < sizeof(buffer); k++){
        while(fgets(buffer, lengthOfFile, f) != NULL){
            newFile[i] = buffer[k];
            i++;
        }
    }

    if(newFile[i] = buffer[k]){
        printf("same size\n");
    }



    for(i = 0; i < sizeof(newFile); i++){
        if(b == newFile[i]){
            byteCount++;
        }
        printf("Final for loop is working???"\n");
    }


}
4

2 に答える 2

2

fgets()OP がファイルのバイナリ読み取りと混在しています。

fgets()\n指定されたバッファ サイズまで、または 1バイトに達するまでファイルを読み取ります。テキスト処理を目的としています。読み取られたデータの量を判断する一般的な方法fgets()は、ファイナルを探す\nことです。これは、存在する場合と存在しない場合があります。読み取られたデータには NUL バイトが埋め込まれている可能性があるため、バッファのスキャンを停止するタイミングを知ることが困難になります。NUL バイトまたは\n.

幸いなことに、ファイルのシークやバッファを含め、これはすべて省くことができます。

// "rb" should be used when looking at a file in binary. C11 7.21.5.3 3
FILE *f = fopen(argv[1], "rb");  
b = atoi(argv[2]);
unsigned long byteCount = 0;
int ch;
while ((ch = fgetc(f)) != EOF) {
  if (ch == b) {
    byteCount++;
  }
}

OP エラー チェックは良好です。しかし、for(k = 0; k < sizeof(buffer); k++){ループとその内容にはさまざまな問題がありました。OPはif(b = newFile[i]){あるべきだったif(b == newFile[i]){

于 2013-09-06T01:53:33.753 に答える