0

ファイルからいくつかの整数を読み込もうとしています。プログラムはエラーなしでコンパイルされますが、整数は出力されません。

int main(int argc,char *argv[]){
if(argc != 2){
    printf("Use %s file_name", argv[0]);
}
else{
    char file_name[255];
    int df,n=0,v[1000],tmp,i;
    strcpy(file_name,argv[1]);
    df=open(file_name,O_RDONLY);
    while(read(df,tmp,sizeof(n))>0){
        v[n++] = tmp;
    }
    for(i=0;i<n;i++){
        printf("%d ",v[i]);
    }
}
return 0;}

新しいコード:

 int main(int argc,char *argv[]){
if(argc != 2){
printf("Use %s file_name", argv[0]);
}
else{
char file_name[255];
int df,n=0,v[1000],tmp,i;
strcpy(file_name,argv[1]);
if ((df=open(file_name,O_RDONLY) ) < 0) {
perror("Cannot open output file\n"); exit(1);
}
while( n != 1000 && ( read(df,&v[n++],sizeof(*v)) > 0) ){}
for(i=0; i!=n; i++){
printf("%c ",(char)v[i]);
}
}
return 0;
}

ファイルに3文字あるにもかかわらず、3つではなく2つのビットパターンしか表示されない前でも

4

2 に答える 2

1

Read は、2 番目の arg として buffer へのポインターを受け取ります

int main(int argc,char *argv[]){
if(argc != 2){
    printf("Use %s file_name", argv[0]);
}
else{
    char file_name[255];
    int df,n=0,v[1000],tmp,i;
    strcpy(file_name,argv[1]);
    if ((df=open(file_name,O_RDONLY) ) < 0) {
    perror("Cannot open output file\n"); exit(1);
    }
    while( n != 1000 && ( read(df,&v[n++],sizeof(*v)) > 0) ){}
    for(i=0; i!=n; i++){
        printf("%d ",v[i]);
    }
}
return 0;
}

あなたのプログラムが segfault を起こさなかったことに、私は実際に驚いています。初期化されていない int をポインター値として使用しています。ファイルが正常に開かれたかどうかを確認する必要があります。また、バッファをオーバーフローさせないようにする必要があるため、反復ごとに n をチェックする必要があります。また、一時変数を使用する必要はありません。バッファに直接書き込むことができます。

于 2013-01-12T18:03:53.397 に答える
0

read は void* を受け取るため、値を格納するために使用する変数のアドレスを渡す必要があります

これを試して

int main(int argc,char *argv[]){
    if(argc != 2){
        printf("Use %s file_name", argv[0]);
    }
    else{
        char file_name[255];
        int df,n=0,v[1000],tmp,i;
        strcpy(file_name,argv[1]);
        df=open(file_name,O_RDONLY);
        while(read(df,&tmp,sizeof(n))>0){
            v[n++] = tmp;
        }
        for(i=0;i<n;i++){
            printf("%d ",v[i]);
        }
    }
    return 0;
}

&temp で温度を変更しました

于 2013-01-12T18:39:19.430 に答える