0

プログラムのこの部分では、テキスト ファイルを読み取り、txt ファイル内の文字列の長さを lenA に渡したいのですが、str1.fa に 10 が含まれている場合、プログラムは 5 を出力し、6 文字は 3 と表示されます。

   #include <iostream.h>
   #include <stdio.h>
   using namespace std;

   int main(){
int lenA = 0;
FILE * fileA;
char holder;
    char *seqA=NULL;
char *temp;

//open first file
fileA=fopen("d:\\str1.fa", "r");

//check to see if it opened okay
if(fileA == NULL) {
    perror ("Error opening 'str1.fa'\n");
    exit(EXIT_FAILURE);
}

//measure file1 length
while(fgetc(fileA) != EOF) {
    holder = fgetc(fileA);
    lenA++;
    temp=(char*)realloc(seqA,lenA*sizeof(char));
    if (temp!=NULL) {
        seqA=temp;
            seqA[lenA-1]=holder;
    }
    else {
        free (seqA);
        puts ("Error (re)allocating memory");
        exit (1);
    }
}
cout<<"len a: "<<lenA<<endl;
free(seqA);
fclose(fileA);

    system("pause");
return 0;
}
4

2 に答える 2

2

fgetcループの反復ごとに 2 回呼び出しているため、1 文字おきに破棄しています。

これを変える:

while(fgetc(fileA) != EOF) {
    holder = fgetc(fileA);

これに:

while((holder = fgetc(fileA)) != EOF) {
于 2013-03-02T11:25:12.283 に答える
1

ファイルを開いてサイズを取得するだけです。メモリの割り当てと文字の読み取りをスキップします...

FILE *f = fopen(fn, "r");
fseek(f, SEEK_END, 0);
long int lenA = ftell(f);
fclose(f);
于 2013-03-02T12:53:10.420 に答える