0

4つの引数を取得するプログラムを作成する必要があります。最初の文字列はバイトに分割されたバイナリファイルを表し、2番目、3番目、4番目(x、y、z)は3つの整数で、合計は8です。各バイト左にxビット、その後にyビット、最後にzビットがあります。各グループは数字を表します。

これらの番号を印刷する必要があります。たとえば、forx=4, y=3, z=1とfileには3バイトがあります。

1010 0001 1 0101 011 1 00100011結果は1001 5 3 1 211になります。

Cのファイルについて教えてください。これが私が書いたものです。

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

#define  SEEK_SET   0

#define  SEEK_CUR   1

#define  SEEK_END   2

int main(int argc, char** argv) {

    if (argc!=5) {
        printf("enter a file name and 3 integers such that their sum is 8");
        return 0;
    } else {
        FILE* f;
        f=fopen(argv[1], "r");
        if (f==NULL) {
            printf("File %s does not exists \n", argv[1]);
            return 0;
        }

        else {
            int length=0;
            int offset=0;
            fseek(f, 0, SEEK_END);
            length=ftell(f);
            fseek(f, 0, SEEK_SET);

            while (offset < length) {
                int i;
                double sum=0;
                for (i=1; i<= atoi(argv[2]); ++i) {
                    double exponent= atoi(argv[1])- i;
                    sum=getc(f)*pow(2, exponent); 

                }
                printf("%d ", (int)sum);
                sum=0;

                for (i=1; i<= atoi(argv[3]); ++i) {
                    double exponent= atoi(argv[1])- i;
                    sum=fetc(f)*pow(2, exponent);
                }
                printf("%d ", (int)sum);
                sum=0;
                for (i=1; i<= atoi(argv[4]); ++i) {
                    double exponent= atoi(argv[1])- i;
                    sum=getc(f)*pow(2, exponent);
                }
                printf("%d ", (int)sum);
                offset+=8;
            }
            fclose(f);
        }

    }
    return 0;
}

いくつかの質問:

  1. argc, **argvファイルを使用する他のプログラムから全体をコピーします。これでいい?私が入力main c:\stackExchange 5 2 1すると、自動的に4とargc 他のパラメータの配列が文字列として与えられますか?私はそうだと思い、上記を書きました。
  2. 私はそれgetc(f)が少し戻ると思いました、これは正しいですか?

その他の修正は大歓迎です。

4

3 に答える 3

2

最初の質問に関しては、配列argc内のエントリの数、つまり引数の数に1を足した数です。argvしたがって、例のコマンドラインargcは5で、argvこれが含まれています。

argv[0] : "main"
argv[1] : "c:\\stackExchange"
argv[2] : "5"
argv[3] : "2"
argv[4] : "1"
argv[5] : NULL

2番目の質問に関してgetcは、整数を返します。整数を返さない場合EOFは、テキストまたはバイナリデータのどちらを読み取るかによって、文字またはバイトとして解釈できます。

于 2012-07-17T12:45:31.673 に答える
2

getc / fgetcは、ビットではなくバイト(= 8ビット)を返します。

ファイルの各バイトについて、メインのWhileでこれを試してください。

char b = fgetc(f); 
printf("%d %d %d ", b>>(y+z), (b<<x)>>(x+z), b<<(x+y)>>(x+y) );
于 2012-07-17T13:01:39.267 に答える
0

追加の(より表面的な)提案:unix / linuxの下では、メインプログラムが成功した場合にのみゼロが返されるという規則がありますが、これはdos/windowsにとっても悪い考えではありません。使用上のヒントの場合、多くの場合1が返されますが、ファイルが見つからないなどの実際のエラーにより、終了コードが2以上になる場合があります。これにより、シェルスクリプトまたはバッチでの一貫した処理が容易になります。

于 2012-07-17T13:29:04.507 に答える