Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Melodie
3070 / 309 / 5
Регистрация: 02.06.2009
Сообщений: 3,297
#1

Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл - C++

16.06.2009, 05:18. Просмотров 667. Ответов 7
Метки нет (Все метки)

Нужен толчок, только начали изучать как работать с файлами. Первое задание и я застряла, нужно сравнить содержимое двух файлов и совпадающую инфо вывести в 3ий файл. Да ещё один файл содержит номера и фамилии а другой только номера. должны сравниваться номера и если совпадают то вместе с фамилией переноситься на 3 файл.

Я дошла только до этого
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define F_WANT "/want.names"
 
 
int main(int argc, char *argv[])
{
 
    FILE *f1, *f2, *out;
    char want_file[10000]; /* declaring a strings to hold contents of the files*/
    char topps_file[1000];
    char new_file[1000];
    char fn[10];
 
    int i;
    int year; 
    
    /*open want.names file*/
    
    if ((f1=fopen(F_WANT,"r"))==NULL)
    {
        printf("Error open file %s.\n", F_WANT);
        exit(1);
    }
    else
    {
        int i=0;
        
        while(fgets(want_file,sizeof want_file ,f1)!=NULL)   /*put contents of the want.names into want_file*/
        {
            fscanf(wants_file,"%*d%s",&input1, &input2);
                    
                    /*   put data into 2 dimentional array */
 
        }
        fclose(f1);
    
        
    /*open topps.xx files using for loop to compare contents with want.name */
        for(i=1; i<=12; ++i) 
        {
            year=atoi(argv[i]);
            sprintf(fn,"topps.%2d",year);
 
            if((f2=fopen(fn,"r"))==NULL)
            {
                printf("Error open file %s\n", fn);
                exit(2);
            }
            else
            {
                int i=0;
                while(fgets(topps_file, sizeof topps_file, f2)!=NULL)
                {
                    fscanf(topps_file,"%s",&input);
                    topps[i] = input;
                    ++i;
 
                }
 
                
            }
            
        }
 
                
    fclose(f2);
 
    return 0;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2009, 05:18     Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл
Посмотрите здесь:

Быстрый способ сравнить содержимое двух файлов - C++
Здравствуйте, подскажите наиболее быстрый способ сравнить содержимое двух текстовых файлов и вывести различия.

Сравнить значения двух массивов и вывести результат в третий массив - C++
Добрый день программисты и те кто любит пощёлкать клавишами. Есть такая задача. Нужно написать программку, которая сравнивала бы значения...

Заполнить файлы случайными данными, сравнить их, и вывести самую длинную совпадающую последовательность - C++
создать 10 файлов,в каждом файле 10 строк, строка длинной 255 символов необходимо заполнить их случайными данными, сравнить их и вывести...

Как сравнить содержимое двух строк - C++
Подскажите, как можно сравнить содержимое двух строк, когда одна объявлена как массив символов char (char str_name, а другую нужно взять из...

Записать в третий файл через один содержимое первого файла и второго - C++
Даны 2 файла содержащие числа , записать в 3 файл через один содержимое первого файла и второго файла и сумму первого и второго

Чтение из двух файлов и запись в третий - C++
Имеется следующая задача: в цикле подсчитывается определенное значение функции fe, зависящее от одного параметра(вводится) и записывается в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.06.2009, 11:06     Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл #2
C
1
        fscanf(wants_file,"%*d%s",&input1, &input2);
здесь, например, попытка сохранить одно значение но по двум адресам, а адресы приведены несущестующие, так как переменных input1 и input2 нет

надо точно представлять, что раскладываешь (то есть иметь формат файла однотипный и легкочитаемый), аргументы командной строки делать в последнюю очередь (поначалу задавая их вручную)

и вместо такой
C
1
2
3
4
5
6
7
8
9
10
11
    if ((f2 = fopen(fn,"r")) == NULL) {
        printf("Error open file %s\n", fn);
        exit(2);
    } else {
        int i = 0;
        while (fgets(topps_file, sizeof topps_file, f2) != NULL) {
            fscanf(topps_file, "%s", &input);
            topps[i] = input;
            ++i;
        }
    }
лучше юзать вот такую
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    if ((f2 = fopen(fn,"r")) == NULL) {
        printf("Error open file %s\n", fn);
        exit(2);
    }
   
    { /* это если тебя волнуют блоки от else */
        int i = 0;
 
        while (fgets(topps_file, sizeof topps_file, f2) != NULL) {
            fscanf(topps_file, "%s", &input);
            topps[i] = input;
            ++i;
        }
    }
потому что тогда код становится кусочным, а кусочки потом переносить можно, так как они становятся автономными
блок, как видишь, может не иметь оператора (если тебе необходимо создавать локальные переменные блока)

тут главное сравниваемые места занести в программу, тогда они становятся отдельными от файлов (то есть перестают от них зависеть), поэтому программа разделяется на чтение и обработку, на чтение, обрабоку и вывод (вообще)
Melodie
3070 / 309 / 5
Регистрация: 02.06.2009
Сообщений: 3,297
16.06.2009, 23:37  [ТС]     Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл #3
Не могу открыть файлы для чтения. вернее первый с файлом который был define# нет проблем , а вот файлы которые должны раскрываться потом НЕ РАСКРЫВАЮТСЯ, "чтоб их".
По этой причине не могу даже проверить если программа работает. Нужна помощь профессионалов.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define F_WANT "/want.names"
 
 
int main(int argc, char *argv[])
{
 
    FILE *f1, *f2, *out;
    char want_file[10000]; /* declaring a strings to hold contents of the files*/
    char topps_file[1000];
    char new_file[1000];
    char fn[10];
    char str[10];
 
    int i;
    int year; 
    
    /*open want.names file*/
    
    if ((f1=fopen(F_WANT,"r"))==NULL)
    {
        printf("Error open file %s.\n", F_WANT);
        exit(1);
    }
    else
    {
        
        
        fgets(want_file,sizeof want_file ,f1);  /*put contents of the want.names into want_file*/
        
        fclose(f1);
    
        
    /*open topps.xx files using for loop to compare contents with want.name */
        int i=0;
        for(i=1; i<=12; ++i) 
        {
            year=atoi(argv[i]);
            sprintf(fn,"topps.%2d",year);
 
            if((f2=fopen(fn,"r"))==NULL)
 
                printf("Error open file %s\n", fn);
                exit(2);
            
                fgets(topps_file, sizeof topps_file, f2);
                
    /*open file for writing*/
                out=fopen("new_file.names", "w");
                if(out==NULL)
                    printf("Error open file %s\n", out);
                    esit(3);
 
                
    /*compare and matched data write to new file*/
                while(!feof(topps_file)||!feof(wants_file))
                {
                    if((str=strcmp(topps_file, wants_file))==0)
                    
                        fprintf(out, "%s", str)
                }
 
                fclose(out);
            }
            
        }
 
    fclose(f2);
 
    return 0;
    }
}
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.06.2009, 01:57     Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл #4
они берутся из командной строки, которая, причём, не проверяется, есть ли они там вообще
тут, например, есть момент

C
1
    for (i = 1; i <= 12; ++i)
очень интересно, а что же будет, если их будет одинадцать

C
1
    sprintf(fn,"topps.%2d",year);
а тут вообще, это на первом годе что будет, "topps. 1" нормальное имя файла, особенно для виндовс (ну, у тебя не виндовс, конечно), а чо тогда тут подчёркивание "new_file.names"
там, видимо, такой год просто не ожидается

вот ещё момент
C
1
    str=strcmp(topps_file, wants_file)
человек не знает, что функция возвращает int
и это при
C
1
    char str[10];
так что, начинать тут надо сначала и сначала делаешь для одного файла, а потом уже сделанное и рабочее можно расширять до нескольких, а потом уже рабочее для нескольких привязывать к командной строке, которую при этом ещё и проверять обязательно
Melodie
3070 / 309 / 5
Регистрация: 02.06.2009
Сообщений: 3,297
17.06.2009, 02:22  [ТС]     Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл #5
очень интересно, а что же будет, если их будет одинадцать
файлов будет 12ю

а тут вообще, это на первом годе что будет, "topps. 1" нормальное имя файла, особенно для виндовс (ну, у тебя не виндовс, конечно), а чо тогда тут подчёркивание "new_file.names"
там, видимо, такой год просто не ожидается
это я могу заменить на

strcpy(fn, "topps.");
strcat(fn, argv[i]);

new_file.names это новый файл который должен выглядеть так же как master file, want.names только должен содержать обновленную инфо поэтому и идет сравнение с другими 12 файлами

проблема с нераскрытием файла всё ещё не решена, все файлы у меня в директории в Debug папке, предполагается что у меня во всяком случае не должно быть проблем с их раскрытием. Я думаю что проблема не в название файла , только не могу понять в чём.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.06.2009, 04:28     Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл #6
Цитата Сообщение от nynicue
файлов будет 12
а это не имеет значения, так как она регирует на параметры
и вот, когда их не двенадцать, например программу запускаешь просто "./program", то она и выпадет в осадок, потому что у программы должно быть не меньше двенадцати параметров, типа
"./program 1 2 3 four five ... "

для контроля параметров применяется argc, он всегда содержит количество параметров программы и по-умолчанию считает, что у программы есть нулевой параметр (её путь запуска), поэтому параметров всегда как бы на один больше
потому, если подаёшь двенадцать параметров, он будет равен тринадцати

C
1
2
3
4
    if (argc < 13) {
        fprintf(stderr, "Usage: program 1 2 ... 12\n");
        exit(1);
    }
тогда программа не будет срабатывать, если параметров меньше, чем надо, больше - пожалуйста, на цикл это не повлияет

а так - цикл будет искать параметр, которого нет, а это - сегфолт

Добавлено через 3 минуты 9 секунд
Цитата Сообщение от nynicue
new_file.names это новый файл который должен выглядеть так же как master file, want.names только должен содержать обновленную инфо поэтому и идет сравнение с другими 12 файлами
имена - это фигня
я тебе писал про содержимое файлов, содержимости должны быть одного формата (чтобы читать одинаково - одной функцией, например), типа одной функцией прочитать то и это, другой функцией сравнить то и это, третьей функцией вывести что надо
Melodie
3070 / 309 / 5
Регистрация: 02.06.2009
Сообщений: 3,297
17.06.2009, 05:12  [ТС]     Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл #7
тогда программа не будет срабатывать, если параметров меньше, чем надо, больше - пожалуйста, на цикл это не повлияет
спасибо познавательно. и всё таки разве это мешает хотя бы открытию первого файла (topps.xx)именно с эим у меня проблемы и я не могу корректировать и вообще делать что то пока не смогу открыть эти файлы. Наверное что то не могу увидеть и конечно же чего то не понимаю.

Наверное мне просто нужно немного побольше времени чтобы разабраться( a то работа. семья. учёба и наоборот времени всегда не хватает)
Ничего где наша не пропадала _ спасибо за помощь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2009, 06:38     Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл
Еще ссылки по теме:

Поменять местами содержимое двух файлов - C++
Задача 6. Даны два файла произвольного типа. Поменять местами их содержимое.

Дано два файла. Получить третий, содержащий поочередно строки исходных двух файлов - C++
Дано два файла. Получить третий, содержащий поочередно строки исходных двух файлов. Надо на dev c++, но я не могу :(

Все числа, содержащиеся в двух бинарных файлах одновременно, переписать в третий файл - C++
Создать два бинарных файла, все числа, содержащиеся в обоих файлах одновременно, переписать в третий файл. Дополнительных массивов не...

Файл: Поменять местами содержимое файлов - C++
Даны два файла А и В (тип элементов одинаковый). Поменять местами содержимое этих файлов


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.06.2009, 06:38     Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл #8
создай там файл topps.10
потом скомпилируй программу
потом запусти её через "./program 10"

в курсе там
C
1
        esit(3);
если не исправить, функция будет не найдена и не будет компилироваться

а ещё есть wants_file в сравнении, хотя такой переменной нет, так как есть want_file

так что, начинать там надо явно не с файлов, ты не можешь просто прочитать с него данные, надо сначала на одном научиться, ещё сравниваешь с wants_file, которая не прочитана, так как для неё нет fgets'а

купи книжку себе Кернигана & Ритчи, потому что иначе просто время теряешь (три года будешь программировать, а уровень будет такой же бажный из-за незнания нюансов)
Yandex
Объявления
17.06.2009, 06:38     Сравнить содержимое двух файлов и совпадающую информацию вывести в третий файл
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru