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

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

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

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

07.10.2011, 00:14. Просмотров 1764. Ответов 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
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 10:53  [ТС] #16
Результат неверен:
a b c d e f g
b c d e f g h
d b c d e f g

v b n k o p
a b j j k l
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 10:54 #17
Без учета регистра:

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
#include<stdio.h>
#include<string.h>
#define N 1024
 
int Strcmp(char *s0, char *t0)
{
   char s[N], t[N];
   int i;
   strcpy(s, s0);
   strcpy(t, t0);
   for(i = 0; s[i] = tolower(s[i]); i++)
      ;
   for(i = 0; t[i] = tolower(t[i]); i++)
      ;
   return strcmp(s, t);
}
 
int Sort(char *fname1, char *fname2, char *fname3)
{
   FILE *f, *g, *h;
   char s0[N], s[N], t0[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
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 10:59  [ТС] #18
То же самое ((
a b c d e f g
b c d e f g h
d b c d e f g

с b n k o p
f b j j k l

Я все же думаю, что без считывания в массив тут никак не обойдешься(( К примеру, оба моих исход файла упорядочены, но по сути в результ файле после двух первых строк из первого исх файла должна встать первая строка из второго исх файла.
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 11:05 #19
Цитата Сообщение от Iska Посмотреть сообщение
Результат неверен:
a b c d e f g
b c d e f g h
d b c d e f g

v b n k o p
a b j j k l
У вас по заданию исходные файлы упорядочены, а во рассматриваете какие?

Добавлено через 4 минуты
Уточню, вы буквы по отдельности упорядочиваете или строчки? У меня со строчками все работает
0
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 11:06  [ТС] #20
да, изначально второй файл был неверный, поправила. Результат тот же(

Упорядочиваю строки. Ваш код попробовала под свои файлы, результат выложила в предпоследнем посте.
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 11:11 #21
Цитата Сообщение от Iska Посмотреть сообщение
Упорядочиваю строки. Ваш код попробовала под свои файлы, результат выложила в предпоследнем посте.
Все работает. Последняя строчка только не переносилась на новую строку, а прилеплялась Вот так попробуйте:

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
#include<stdio.h>
#include<string.h>
#define N 1024
 
int Strcmp(char *s0, char *t0)
{
   char s[N], t[N];
   int i;
   strcpy(s, s0);
   strcpy(t, t0);
   for(i = 0; s[i] = tolower(s[i]); i++)
      ;
   for(i = 0; t[i] = tolower(t[i]); i++)
      ;
   return strcmp(s, t);
}
 
int Sort(char *fname1, char *fname2, char *fname3)
{
   FILE *f, *g, *h;
   char s0[N], s[N], t0[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)
       {
           fprintf(h, "%s\n", s);
           sflag = fgets(s, N, f);
       }
       else
       {
           fprintf(h, "%s\n", t);
           tflag = fgets(t, N, g);
       }
   }
   if (sflag)
      do
          fprintf(h, "%s\n", s);
      while(fgets(s, N, f));
   else
      do
          fprintf(h, "%s\n", t);
      while(fgets(t, N, g));
 
   fclose(f); fclose(g); fclose(h);
   return 0;
}
 
int main()
{
   printf("%d\n", Sort("c:\\a.txt", "c:\\b.txt", "c:\\c.txt"));
   getchar();
   return 0;
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.10.2011, 11:13 #22
Цитата Сообщение от Thinker Посмотреть сообщение
Без учета регистра:
В обоих вариантах есть косяк, кажется. Если строки в обоих файлах совпадают, то только одна из них добавится.
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 11:15 #23
Цитата Сообщение от Deviaphan Посмотреть сообщение
В обоих вариантах есть косяк, кажется. Если строки в обоих файлах совпадают, то только одна из них добавится.
Вам кажется, все учтено
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.10.2011, 11:18 #24
Хорошо.) Просто сравнение if-else было похоже именно то, что я подумал.)
Сейчас уже понял, что добавляются же все строки и одинаковые тоже добавятся чуть позже. Тупанул.
0
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 11:21  [ТС] #25
Выдается нолик, создается файлик выходной, в нем след. данные:

a b c d e f g

b c d e f g h

d b c d e f g



с b n k o p

f b j j k l

Не пойму в чем проблема( меняю только имена файлов. А у Вас на каких строках работает? из чего у Вас исходные файлы состоят?
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 11:42 #26
Вот так красивее строчки выводит:

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
75
76
#include<stdio.h>
#include<string.h>
#define N 1024
 
int Strcmp(char *s0, char *t0)
{
   char s[N], t[N];
   int i;
   strcpy(s, s0);
   strcpy(t, t0);
   for(i = 0; s[i] = tolower(s[i]); i++)
      ;
   if (s0[i-1] == '\n')
      s0[i-1] = '\0';
   for(i = 0; t[i] = tolower(t[i]); i++)
      ;
   if (t0[i-1] == '\n')
      t0[i-1] = '\0';
   return strcmp(s, t);
}
 
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);
           fputc('\n', h);
           sflag = fgets(s, N, f);
       }
       else
       {
           fputs(t, h);
           fputc('\n', h);
           tflag = fgets(t, N, g);
       }
   }
   if (sflag)
      do
      {
           fputs(s, h);
           fputc('\n', h);
      }
      while(fgets(s, N, f));
   else
      do
      {
           fputs(t, h);
           fputc('\n', h);
      }
      while(fgets(t, N, g));
 
   fclose(f); fclose(g); fclose(h);
   return 0;
}
 
int main()
{
   printf("%d\n", Sort("c:\\a.txt", "c:\\b.txt", "c:\\c.txt"));
   getchar();
   return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от Iska Посмотреть сообщение
Выдается нолик, создается файлик выходной, в нем след. данные:

a b c d e f g

b c d e f g h

d b c d e f g



с b n k o p

f b j j k l

Не пойму в чем проблема( меняю только имена файлов. А у Вас на каких строках работает? из чего у Вас исходные файлы состоят?
На ваших работает и на любых других. Нолик в консоли выводит как результат успешной работы. а результат в файле c:\\c.txt:
a b c d e f g
b c d e f g h
c b n k o p
d b c d e f g
f b j j k l


Iska, ну как, разобрались? Используйте программу из данного поста, она более отшлифована
1
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 11:50  [ТС] #27
Вы меня извините за назойливость, но все же в результ файле у меня все тоже самое.
Прописываю пути в разные места и все равно все одно и тоже.
Я работаю в Dev-C++ - может быть дело в этом?
Я уже все пересмотрела - не меняются местами сроки и все тут.
Результ файл создается, информация туда пишется, но такое ощущение, что просто из файлов, обходя сортировку.
Для функции tolower подключила модуль #include <ctype.h>.
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 11:55 #28
Цитата Сообщение от Iska Посмотреть сообщение
но все же в результ файле у меня все тоже самое.
Не может быть, все проверил, теоретически обосновал, у меня все правильно выдает. Попробуйте сначала с выводом на экран (напишите что на экране будет):

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
75
76
77
78
79
80
81
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define N 1024
 
int Strcmp(char *s0, char *t0)
{
   char s[N], t[N];
   int i;
   strcpy(s, s0);
   strcpy(t, t0);
   for(i = 0; s[i] = tolower(s[i]); i++)
      ;
   if (s0[i-1] == '\n')
      s0[i-1] = '\0';
   for(i = 0; t[i] = tolower(t[i]); i++)
      ;
   if (t0[i-1] == '\n')
      t0[i-1] = '\0';
   return strcmp(s, t);
}
 
int Sort(char *fname1, char *fname2, char *fname3)
{
   FILE *f, *g, *h;
   char s0[N], s[N], t0[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);
           fputc('\n', h);
           puts(s);
           sflag = fgets(s, N, f);
       }
       else
       {
           fputs(t, h);
           fputc('\n', h);
           puts(t);
           tflag = fgets(t, N, g);
       }
   }
   if (sflag)
      do
      {
           fputs(s, h);
           fputc('\n', h);
           puts(s);
      }
      while(fgets(s, N, f));
   else
      do
      {
           fputs(t, h);
           fputc('\n', h);
           puts(t);
      }
      while(fgets(t, N, g));
 
   fclose(f); fclose(g); fclose(h);
   return 0;
}
 
int main()
{
   printf("%d\n", Sort("c:\\a.txt", "c:\\b.txt", "c:\\c.txt"));
   getchar();
   return 0;
}
1
Iska
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 12:03  [ТС] #29
СПАСИБО ОГРОМНОЕ!
Сейчас все заработало.
Дело в том, что при сравнении двух строк строки д.б. одной длинны. У меня строка одна во втором файле была короче всех остальных.
При выводе строки сейчас переставляются, но между предпоследней строкой и последней стоит пустая строка, но с этим уж я сама попробую разобраться.

Еще раз огромное спасибо!
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 12:09 #30
Цитата Сообщение от Iska Посмотреть сообщение
Дело в том, что при сравнении двух строк строки д.б. одной длинны.
Ну, смотрите сами, программа работает со строками произвольной длины.

Добавлено через 1 минуту
Цитата Сообщение от Iska Посмотреть сообщение
но между предпоследней строкой и последней стоит пустая строка
в последней версии программы все учтено и красиво выводится.
0
07.10.2011, 12:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2011, 12:09
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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