2
int parity (char msg[1400]) {

  int parity = 0;
  int i,j;
  char c;

  for(i=0;i<strlen(msg);i++) {
    for(j=0;j<8;j++) {
      c = msg[i];
      int bit = (c>>j)&1;
      parity ^= bit;
    }
  }

  return parity;
}

次の例では、この関数は適切な結果を返します。

char* msg = malloc(sizeof(char*)*1400);
strcpy(msg,"some string");
int parity = parity(msg);

次の例では、結果は良くありません:

    char* msg = malloc(sizeof(char*)*1400);
    FILE *fp;
    fp = fopen(filename,"r");  //filename is a binary file
    while( !feof(fp) ){
      fread(msg,1399,sizeof(char),fp);
      int parity = parity(msg); //--> the result isn't well
      //.......
    }

ファイルから読み取るときに、strlen(msg)が各ステップ(192、80、200 ...など)で変数であることがわかりました。2 番目の例では、「パリティ」関数を変更する必要があります。助言がありますか?

4

2 に答える 2

0

feof()私は完全に避けます-fread()読み取ったバイト数を示します。また、バイナリファイルだと言いますが、文字列関数を使用しています-それらは機能しません。

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

#define BUFMAX 1400

int main(void){
    unsigned char buffer[BUFMAX];
    int i, bit, len, parity = 0;
    FILE *fp;
    if ((fp = fopen("myfile.dat", "rb")) == NULL) {
        printf("Cannot open file\n");
        return 1;
    }
    while ((len = fread(buffer, 1, BUFMAX, fp))) {
        for (i=0; i<len; i++) {
            for (bit=0; bit<CHAR_BIT; bit++) {
                parity ^= (buffer[i] & 1);
                buffer[i] >>= 1;
            }
        }
    }
    fclose (fp);
    printf ("Parity = %d\n", parity);
    return 0;
}
于 2015-03-27T21:02:39.147 に答える