0

次のような2つのファイルがあります。

ファイル A は次のとおりです。

J5
J15
J25
J30
J35

ファイル B は次のとおりです。

J0 23 56
J5 24 58
J10 26 60
J15 29 63
J20 31 36
J25 23 32
J30 51 14
J35 34 21
J40 46 12

問題は、ファイル A とファイル B の内容をチェックし、次のように J 番目の項目の値を新しいファイルにコピーする必要があることです: (ファイル C):

J5 24 58
J15 29 63
J25 23 32
J30 51 14
J35 34 21

この問題に対処するための C コードを作成していただけると大変助かります。ありがとう。

4

3 に答える 3

1

3 つの「ランダム アクセス ファイル」を作成することをお勧めします (より整理されているため)。

  • 使用する構造で各ファイルをフォーマットする必要があります。最初のファイルでは構造 [1] 名前 (char 配列) のメンバーが 1 つだけ必要です。2 番目の構造 [2] では、名前 (char 配列) の 3 つのメンバーが必要です。 ) と 2 つの値 (2 つの整数だと思います) であり、3 番目の構造は 2 番目の構造と同じであるため、再利用できます。

[1]

/* Struct for the first file. */
typedef {
    char name[4];
} file1_t;

[2]

/* Struct for the second file. */
typedef {
    char name[4];
    int value1, value2;
} file2_t;
  • これらのファイルを作成するには、次のようなコードを使用する必要があります (ファイルが「wb」モードで開かれているが、作成されていないと仮定します):

    /* This is an incomplete example (I can't make your whole Homework)*/
    
    void file2Creator( FILE *fPtr )
    {
        int i; // Counter to create the file.
        file2_t data = { "", 0, 0 }; // A blank example to format the file.
    
        /* You will create 9 consecutive records*/
        for( i = 1; i <= 9; i++ ){
            fwrite( &data, sizeof( file2_t ), 1, fPtr );
        }
    
        fclose( fPtr ); // You can close the file here or later however you need.  
    }
    
  • その後、作成した空白スペースを埋める必要があります(ファイルが開かれていると思います):

    void fillFile2( FILE *fPtr)
    {
        int position;
        file2_t data = { "", 0, 0 };
    
    
        printf( "Enter the position to fill (1-9) 0 to finish:\n?" );
        scanf( "%d", &position );
    
        while( position != 0 ){
            printf( "Enter the name, and the two other values (integers):\n?" );
            fscanf( stdin, "%s%d%d", data.name, data.value1, data.value2 );
    
            /* You have to seek the pointer. */
            fseek( fPtr, ( position - 1 ) * sizeof( file2_t ), SEEK_SET );
            fwrite( &data, sizeof( file2_t ), 1, fPtr );
            printf( "Enter a new position (1-9) 0 to finish:\n?" );
            scanf( "%d", &position );
        }
    
        fclose( fPtr ); //You can close the file or not, depends in what you need.
    }
    
  • 今、ファイル 1、ファイル 2、ファイル 3 がフォーマットされていて、ファイル 1 と 2 がいっぱいで、ファイル 3 をいっぱいにしたいのですが、どうすればいいですか? 単純。

    /* 3 pointers to each file */
    void fillFile3( FILE *f1Ptr, FILE *f2Ptr, FILE *f3Ptr )
    {
        int i, j, k, number;
        char word[ 4 ];
        file1_t data1 = { "" };
        file2_t data2, data3 = { "", 0, 0 };
    
        k = 1;
    
        /* I suppose that files are opened with their correctly FILE pointers. */
        for( i = 1; i <= 5; i++ ){
    
            /* I locate in the "i" position of the file1. */
            fseek( f1Ptr, ( i - 1 ) * sizeof( file1_t ), SEEK_SET );
    
            /* I read the slot. */
            fread( &data1, sizeof( file1_t ), 1, f1Ptr );
    
            /*Now we compare the file2 until we find the correct value, if it is organized we can jump some slots if not compare with all.*/
            for( j = 1; j <= 9, j++ ){
                fseek( f2Ptr, ( j - 1 ) * sizeof( file2_t ), SEEK_SET );
                fread( &data2, sizeof( file2_t ), 1, f2Ptr );
    
                /* We compare the strings, If they are equal we paste the value in file 3*/
                if( strcmp( data1.name, data2.name ) == 0 ){
    
                   /*file 3 is of type of the file 2*/
                   fseek( f3Ptr, ( k - 1 ) * sizeof( file2_t ), SEEK_SET );
                   fwrite( &data2, sizeof( file2_t ), 1, f3Ptr );
                   k++;
                   break;
                }
            }
        }
        fclose( f1Ptr );
        fclose( f2Ptr );
        fclose( f3Ptr );
    }
    
于 2012-11-18T12:51:22.483 に答える
0

私はこのプログラムを実行しようとしていますが、実行されません。

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

int main()
{
    FILE *fp1 ,*fp2;
    char ca , cb;
    int i,j,x,s;
    char A[i][j],B[i][j];
    char file1[1024], file2[1024];

    printf( "Enter file1: ", file1 );
    gets( file1 );
    printf( "Enter file2: ",file2 );
    gets( file2 );
    fp1=fopen( file1, "r");

    if ( fp1 == NULL ){
        printf("Cannot open %s for reading \n", file1 );
        exit(1);
    }

    while ( ( fgets( file1, sizeof file1, stdin ) ) != EOF ){
        for(i=0;i<2500;i++){
            for(j=0;j<5;j++){
                fscanf(fp1,"%s",&A[i][j]);
            }
        }
    }

    fp2 = fopen( file2, "r");

    if ( fp2 == NULL ){
        printf("Cannot open %s for reading \n", file2 );
        exit( 1 );
    }

    while ( fgets ( file2, sizeof file2, stdin) != EOF){
        for( i = 0; i < 2500; i++ ){
            for( j = 0; j < 5; j++ ){
                fscanf(fp2,"%s",&B[i][j]);
            }
        }
    }
    /*Here it was a ; without any sense (after the if)*/
    if( strcmp( A[i][j], B[i][j] ) ) == 0;
    {
        printf( "%s /n %s  ", strcmp( A[i][j], B[i][j] ) );
    }

    fclose(fp1);
    fclose(fp2);

    return 0;
}

コンパイラは、 "=="トークンの前に構文エラーを表示します(strcmp関数の下から8行目)。何か助けは??

于 2012-11-19T22:29:14.593 に答える
0

if の後にセミコロンを追加し、括弧を忘れました。

if( strcmp( A[i][j], B[i][j] ) == 0 ){
        printf( "%s /n %s  ", strcmp( A[i][j], B[i][j] ) );
}
于 2012-11-19T22:40:27.940 に答える