3071 / 313 / 5
Регистрация: 02.06.2009
Сообщений: 3,293
1

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

16.06.2009, 05:18. Показов 2218. Ответов 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;
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2009, 05:18
Ответы с готовыми решениями:

Сравнить содержимое этих файлов и записать в файл H все совподающие компоненты файлов F G
Помогите срочно. Даны текстовые файлы F и G. Сравнить содержимое этих файлов и записать в файл H...

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

Сравнить содержимое файлов между собой, и если оно совпадает, то вывести на экран имена этих файлов
Прошу помощи у знающих людей. Существует 2 массива, содержащих названия файлов.Требуется сравнить...

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

7
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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;
        }
    }
потому что тогда код становится кусочным, а кусочки потом переносить можно, так как они становятся автономными
блок, как видишь, может не иметь оператора (если тебе необходимо создавать локальные переменные блока)

тут главное сравниваемые места занести в программу, тогда они становятся отдельными от файлов (то есть перестают от них зависеть), поэтому программа разделяется на чтение и обработку, на чтение, обрабоку и вывод (вообще)
1
3071 / 313 / 5
Регистрация: 02.06.2009
Сообщений: 3,293
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;
    }
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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];
так что, начинать тут надо сначала и сначала делаешь для одного файла, а потом уже сделанное и рабочее можно расширять до нескольких, а потом уже рабочее для нескольких привязывать к командной строке, которую при этом ещё и проверять обязательно
0
3071 / 313 / 5
Регистрация: 02.06.2009
Сообщений: 3,293
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 папке, предполагается что у меня во всяком случае не должно быть проблем с их раскрытием. Я думаю что проблема не в название файла , только не могу понять в чём.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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 файлами
имена - это фигня
я тебе писал про содержимое файлов, содержимости должны быть одного формата (чтобы читать одинаково - одной функцией, например), типа одной функцией прочитать то и это, другой функцией сравнить то и это, третьей функцией вывести что надо
0
3071 / 313 / 5
Регистрация: 02.06.2009
Сообщений: 3,293
17.06.2009, 05:12  [ТС] 7
тогда программа не будет срабатывать, если параметров меньше, чем надо, больше - пожалуйста, на цикл это не повлияет
спасибо познавательно. и всё таки разве это мешает хотя бы открытию первого файла (topps.xx)именно с эим у меня проблемы и я не могу корректировать и вообще делать что то пока не смогу открыть эти файлы. Наверное что то не могу увидеть и конечно же чего то не понимаю.

Наверное мне просто нужно немного побольше времени чтобы разабраться( a то работа. семья. учёба и наоборот времени всегда не хватает)
Ничего где наша не пропадала _ спасибо за помощь.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.06.2009, 06:38 8
создай там файл topps.10
потом скомпилируй программу
потом запусти её через "./program 10"

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

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

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

купи книжку себе Кернигана & Ритчи, потому что иначе просто время теряешь (три года будешь программировать, а уровень будет такой же бажный из-за незнания нюансов)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2009, 06:38
Помогаю со студенческими работами здесь

Сравнить посимвольно содержимое двух RichEdit и вывести число отличий
Доброго времени суток! Прошу прощения за глупый вопрос, нигде не могу найти как сравнить между...

Сравнить два текстовых файла и вывести одинаковые строки в третий файл
Добрый вечер. Нужно решение такой задачки. Имею рабочий каталог D:\video\ с десятком...

Записать в третий файл одинаковые числа из двух файлов
имеется файл g и файл f с целыми числами. надо в файл h записать одинаковые числа из двух...

Сравнить два текстовых файла и вывести одинаковые строки ( значения выше на одну строку) в третий файл
Добрый вечер. Нужна помощь знатоков Есть текстовый файл по пути D:\arxiv\rezultcat.txt с...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru