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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
#1

Работа с текстовыми файлами и строками - C++

07.10.2011, 00:14. Просмотров 1719. Ответов 34
Метки нет (Все метки)

Очень прошу вашей помощи. Не один день сижу над данной задачей, переделала кучу вариантов - выход не верно ((
Задание: дано два текстовых упорядоченных файла. Необходимо слить их в один, сохранив лексикографическую упорядоченность.
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
const int n=20;
const int m=20;
main()
  {
    char f1[50],f2[50],fout[50];
    char a[n],b[n];
    int i,j;
    char mas[n];
    char *ps[n][n];
    char bal;
    
    // Ââîä èìåГ*ГЁ ïåðâîãî ГґГ*éëГ*
      printf("Enter name of file F1 \n");
      scanf("%s",f1);
      FILE *ff1;
      ff1=fopen (f1,"r");
    // Ââîä èìåГ*ГЁ âòîðîãî ГґГ*éëГ*
      printf("Enter name of file F2 \n");
      scanf("%s",f2);
      FILE *ff2;
      ff2=fopen (f2,"r"); 
      
    // ÏðîâåðêГ* Г*Г* ñóùåñòâîâГ*Г*ГЁГҐ ГґГ*éëГ*
      if (ff1==NULL || ff2==NULL)  
        { 
         printf("File not found");
         getch();
         return 1; // Âûõîä ГЇГ® îøèáêå             
         }     
         
    // Ââîä èìåГ*ГЁ âûõîäГ*îãî ГґГ*éëГ*
      printf("Enter name of file Fout \n");
      scanf("%s",fout);
      FILE *fo;
      fo=fopen (fout,"w");     
      while(!feof(ff1)) // ïîêГ* Г*ГҐ ГЄГ®Г*ГҐГ¶ ГґГ*éëîâ     
               {
                fgets(a,n,ff1);
                  while(!feof(ff2))
                     fgets(b,n,ff2);
                     if (strcmp(a,b)>0)
                       {               
                        fprintf(fo,"%s\n",b);
                        }
                     if (strcmp(a,b)<0) //Г±Г°Г*ГўГ*ГҐГ*ГЁГҐ ñòðîê           
                       {
                        fprintf(fo,"%s\n",a);
                        i++;
             
    fclose(ff1);
    fclose(ff2);
    fclose(fo);
    //return 0;
    getch();   
 }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2011, 09:25     Работа с текстовыми файлами и строками #2
Цитата Сообщение от Iska Посмотреть сообщение
сохранив лексикографическую упорядоченность.
- что именно под этим подразумевается, написать не проблема задание недопонял
Haster
инженер-системотехник
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
07.10.2011, 09:45     Работа с текстовыми файлами и строками #3
-=ЮрА=-, как я понял, результирующий файл должна быть тоже упорядочен
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 09:56  [ТС]     Работа с текстовыми файлами и строками #4
Да, результирующий файл должен быть тоже упорядочен. Т.е. строки из двух файлов сравниваются между собой и встают по алфавиту.

Ребят, какие я только варианты не перебрала. Может вы мне поможете советом:
1) куда считать строку из файла (массив, структура и т.д.)
2) сортировку думаю делать через указатели, но для этого строки из файла нужно считать в массив, а у меня это почему-то никак не выходит(((
Программа нужна только на Си.
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2011, 10:05     Работа с текстовыми файлами и строками #5
Цитата Сообщение от Iska Посмотреть сообщение
Ребят, какие я только варианты не перебрала. Может вы мне поможете советом:
1) куда считать строку из файла (массив, структура и т.д.)
2) сортировку думаю делать через указатели, но для этого строки из файла нужно считать в массив, а у меня это почему-то никак не выходит(((
Программа нужна только на Си.
- это не проблемма, в алгоритм слития никак не въеду, так надо сделать как ниже:
Цитата Сообщение от Iska Посмотреть сообщение
Т.е. строки из двух файлов сравниваются между собой и встают по алфавиту.
- сравниваются первые буквы, так надо
Файл 1
авапрвап
врлрар
Файл 2
бавопов

Файл 1 + Файл 2
авапрвап
бавопов
врлрар
Если да ждём до часика, я напаяю!
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 10:13  [ТС]     Работа с текстовыми файлами и строками #6
Да, сравнение, как я поняла, именно такое.
Изначально у меня проблема была в том, что при сравнении строк в результ. файл записывался результат только от сравнения конкретно этих двух строк. А по сути все строки из первого должны сравниться со строками второго и только потом все эти строки должны быть упорядочены и записаны.
С цифрами не сложно, а вот со строками целая проблема (((
буду пытаться дальше...
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 10:14     Работа с текстовыми файлами и строками #7
Ваша задача тривиальная. Подразумевается использование базы сортировки слиянием. То есть один раз проходите по первому файлу и по второму, а в результате - упорядоченный третий файл. Здесь даже сортировка не нужна, нужно правильно только алгоритм организовать.
Haster
инженер-системотехник
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
07.10.2011, 10:15     Работа с текстовыми файлами и строками #8
Дай подумать....
Как я понял тебе нужны массивы указателей, это что-то типа
char *mas[100]
В данном случае массив mas позволяет хранить 100 строк. Но при этом fgets при считывании данных из файла требует в качестве параметра буфер (т.е. сама функция буфер не выделяет.
Поэтому тебе придется динамически выделять память...
Ну либо если известна макс. длина строки в файлах, то можно использовать
char mas[100][20];
т.е. в данном случае 100 строк длиной 20. Но память будет не рационально использоваться, зато проще работать.
Далее что-то типа:
int i = 0;
while (!eof)
{
fgets(mas[i],20,file);
i++;
}
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 10:16     Работа с текстовыми файлами и строками #9
Цитата Сообщение от Iska Посмотреть сообщение
Да, сравнение, как я поняла, именно такое.
Учтите, сравнение не по первой букве, а по всем, лексикографический порядок не знаете что-ли...
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 10:17  [ТС]     Работа с текстовыми файлами и строками #10
смысл-то понятен. Не могли бы Вы в общих чертах структурно описать базу сортировки слиянием.
Т.е. "проходите по первому файлу" - я его считываю в массив? также со вторым и между собой сортирую массивы? Или тут какая-то другая реализация?
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 10:20     Работа с текстовыми файлами и строками #11
Цитата Сообщение от Haster Посмотреть сообщение
Дай подумать....
Как я понял тебе нужны массивы указателей, это что-то типа
char *mas[100]
Зачем ерундой заниматься, никаких промежуточных структур не надо для хранения.

Добавлено через 2 минуты
Цитата Сообщение от Iska Посмотреть сообщение
смысл-то понятен. Не могли бы Вы в общих чертах структурно описать базу сортировки слиянием.
Т.е. "проходите по первому файлу" - я его считываю в массив? также со вторым и между собой сортирую массивы? Или тут какая-то другая реализация?
Считываете первый элемент (слово или строку) из первого файла и то же из второго, сравниваете, меньшее записываете в третий файл. Далее считываете из того файла, строка которой оказалась меньше и опять сравниваете и так далее.

Реализуйте для массивов с числами такой алгоритм и поймете насколько все просто
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 10:25  [ТС]     Работа с текстовыми файлами и строками #12
Цитата Сообщение от Haster Посмотреть сообщение
Дай подумать....

Далее что-то типа:
int i = 0;
while (!eof)
{
fgets(mas[i],20,file);
i++;
}
я пробовала так делать, в итоге вылетает ошибка на строке:
fgets(a[i],20,ff1);
In function `int main()':
invalid conversion from `char' to `char*'
initializing argument 1 of `char* fgets(char*, int, FILE*)'

Добавлено через 2 минуты
спасибо за совет! попробую использовать данную логику.
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 10:25     Работа с текстовыми файлами и строками #13
Iska, реализуйте с массивами, я если что помогу и с файлами тоже. алгоритм банально прост Главное, никаких дополнительных массивов!!!
Haster
инженер-системотехник
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
07.10.2011, 10:29     Работа с текстовыми файлами и строками #14
Нужно так fgets(&a[i],20,ff1);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2011, 10:47     Работа с текстовыми файлами и строками
Еще ссылки по теме:
C++ Работа с текстовыми файлами
C++ Работа с текстовыми файлами в С++
Работа с текстовыми файлами C++
Работа с текстовыми файлами C++
C++ Работа с текстовыми файлами

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 10:47     Работа с текстовыми файлами и строками #15
Вариант лексикографического сравнения с учетом регистра. Если надо без учета регистра, напишите.

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
#include<stdio.h>
#include<string.h>
#define N 1024
 
int Sort(char *fname1, char *fname2, char *fname3)
{
   FILE *f, *g, *h;
   char s[N], t[N];
   char *sflag, *tflag;
   f = fopen(fname1, "r");
   g = fopen(fname2, "r");
   h = fopen(fname3, "w");
   if (!f || !g || !h)
   {
       fclose(f); fclose(g); fclose(h);
       return 1;
   }
   sflag = fgets(s, N, f);
   tflag = fgets(t, N, g);
   while (sflag && tflag)
   {
       if (strcmp(s, t) < 0)
       {
           fputs(s, h);
           sflag = fgets(s, N, f);
       }
       else
       {
           fputs(t, h);
           tflag = fgets(t, N, g);
       }
   }
   if (sflag)
      do
          fputs(s, h);
      while(fgets(s, N, f));
   else
      do
          fputs(t, h);
      while(fgets(t, N, g));
 
   fclose(f); fclose(g); fclose(h);
   return 0;
}
 
int main()
{
   Sort("c:\\a.txt", "c:\\b.txt", "c:\\c.txt");
   getchar();
   return 0;
}
Yandex
Объявления
07.10.2011, 10:47     Работа с текстовыми файлами и строками
Ответ Создать тему
Опции темы

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