Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

07.10.2011, 00:14. Просмотров 1771. Ответов 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();   
 }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2011, 00:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с текстовыми файлами и строками (C++):

Работа с файлами и текстовыми строками - C++
Привет, программисты. Мне было дано задание: Задан текст в каждом слове производить циклический сдвиг букв вправо на заданное с...

Работа с текстовыми строками (нужно закончить программу) - C++
часть программы написал, а другую не могу ... помогите закончить ее. С клавиатуры вводится строка. Разработать программу, которая...

Работа с текстовыми файлами - C++
Пожалуйста, помогите с задачей: Дан файл f, компоненты которого являются действительными числами. Найти: 1.наибольшее из значений...

Работа с текстовыми файлами - C++
Люди добрые кто может подскажите)) Задание: Дан текстовый файл, проставить пробелы после знаков препинания &quot;,.?!&quot; если он отсутствует,...

Работа с текстовыми файлами - C++
Делаю лабы по С++. Необходимо записать несколько строк в файл, а затем считать их оттуда. Использую методы, описанные в методичке (по сути,...

Работа с текстовыми файлами - C++
Во входной файл подается текст вида: aaabcbbffff В исходной файле получается: 3аbc2b4f простейшая компоновка получается. #include...

34
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2011, 09:25 #2
Цитата Сообщение от Iska Посмотреть сообщение
сохранив лексикографическую упорядоченность.
- что именно под этим подразумевается, написать не проблема задание недопонял
0
Haster
инженер-системотехник
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
07.10.2011, 09:45 #3
-=ЮрА=-, как я понял, результирующий файл должна быть тоже упорядочен
0
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 09:56  [ТС] #4
Да, результирующий файл должен быть тоже упорядочен. Т.е. строки из двух файлов сравниваются между собой и встают по алфавиту.

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

Файл 1 + Файл 2
авапрвап
бавопов
врлрар
Если да ждём до часика, я напаяю!
0
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 10:13  [ТС] #6
Да, сравнение, как я поняла, именно такое.
Изначально у меня проблема была в том, что при сравнении строк в результ. файл записывался результат только от сравнения конкретно этих двух строк. А по сути все строки из первого должны сравниться со строками второго и только потом все эти строки должны быть упорядочены и записаны.
С цифрами не сложно, а вот со строками целая проблема (((
буду пытаться дальше...
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 10:14 #7
Ваша задача тривиальная. Подразумевается использование базы сортировки слиянием. То есть один раз проходите по первому файлу и по второму, а в результате - упорядоченный третий файл. Здесь даже сортировка не нужна, нужно правильно только алгоритм организовать.
0
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++;
}
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 10:16 #9
Цитата Сообщение от Iska Посмотреть сообщение
Да, сравнение, как я поняла, именно такое.
Учтите, сравнение не по первой букве, а по всем, лексикографический порядок не знаете что-ли...
0
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 10:17  [ТС] #10
смысл-то понятен. Не могли бы Вы в общих чертах структурно описать базу сортировки слиянием.
Т.е. "проходите по первому файлу" - я его считываю в массив? также со вторым и между собой сортирую массивы? Или тут какая-то другая реализация?
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 10:20 #11
Цитата Сообщение от Haster Посмотреть сообщение
Дай подумать....
Как я понял тебе нужны массивы указателей, это что-то типа
char *mas[100]
Зачем ерундой заниматься, никаких промежуточных структур не надо для хранения.

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

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

C++ работа с текстовыми файлами - C++
Доброго времени суток. Делал программу, но столкнулся с некоторыми трудностями. у меня в текстовом файле записано 6 цифр, и из него в...

Работа с текстовыми файлами - C++
Дан текстовый файл. Напечатать все строки, длина которых равна данному числу.

Работа с текстовыми файлами - C++
Функция копирует с одного файла в другой, не подскажите как улучшить ее? И есть недостаток нужно подсчитывать количество элементов в файле...

Работа с текстовыми файлами в С++ - C++
Каким образом можно организовать эту программу, в частности определение цифры и латинской буквы и их распределение по файлам. Чот в тупике...


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

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

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