сравнение и проверка столбцов в двух файлах [закрыто]

У меня есть два файла, который выглядит так:

ФАЙЛ А это:

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 для его содержимого и скопировать значения элементов Jth в новый файл, например: (ФАЙЛ C):

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

Было бы здорово помочь, если вы сформулируете код C для решения этой проблемы. Благодарю.

 krishcal2318 нояб. 2012 г., 10:35
честно говоря, у меня нет опыта программирования звука, и я не смог понять, как сделать первый шаг к решению.
 krishcal2318 нояб. 2012 г., 10:46
да, конечно, я собираюсь сделать. Честно говоря, я сейчас сижу с книгой по программированию. Но все равно ничего не получаю. было бы хорошо, если бы вы могли пролить на него немного света. :)
 Mat18 нояб. 2012 г., 10:40
Тогда вам нужно проводить больше времени с хорошей книгой и учебными пособиями. И поиск. Разбейте свою проблему на различные шаги, которые необходимо предпринять для достижения своей цели, и попробуйте написать каждый из них. Если там'это конкретный шаг, который вы можетене получается, задайте вопрос об этом с кодом, который у вас есть до сих пор.
 Mat18 нояб. 2012 г., 10:47
Ну это такдовольно просто. Вы должны выяснить, как читать файл, а затем, как читатьдва файлы и как сравнивать строки. Ничто из этого не является черной магией и не должно быть охвачено любой приличной книгой Си.

Ответы на вопрос(3)

Файлы с произвольным доступом » (потому что они более организованы), но сначала:

Вам нужно отформатировать каждый файл со структурой, которую он будет использовать, в первом файле структура [1]. Вам просто нужен один член имя (массив символов), во второй структуре [2] вам нужно три члена имя (массив символов). ) и 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;

Для создания этих файлов вы должны будете использовать такой код (Предположим, что файл открыт втермометр» режим, но не создан):

/* 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 );
}

#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;
}
</stdlib.h></stdio.h>

компилятор показывает синтаксическую ошибку перед "==» токен (8-я строка снизу в функции strcmp). Любая помощь ??

Вы добавили точку с запятой после if и забыли скобки.

if( strcmp( A[i][j], B[i][j] ) == 0 ){
        printf( "%s /n %s  ", strcmp( A[i][j], B[i][j] ) );
}
 krishcal2320 нояб. 2012 г., 07:42
Теперь я исправил это. Сборник удался. Но программа не работает. Что может быть причиной ???

Ваш ответ на вопрос