Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
1

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

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

Author24 — интернет-сервис помощи студентам
Очень прошу вашей помощи. Не один день сижу над данной задачей, переделала кучу вариантов - выход не верно ((
Задание: дано два текстовых упорядоченных файла. Необходимо слить их в один, сохранив лексикографическую упорядоченность.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2011, 00:14
Ответы с готовыми решениями:

Работа с текстовыми файлами и строками
Создать в редакторе текстовый файл, внести в него несколько строк произвольного текста. Разработать...

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

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

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

34
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 11:11 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.10.2011, 11:13 22
Цитата Сообщение от Thinker Посмотреть сообщение
Без учета регистра:
В обоих вариантах есть косяк, кажется. Если строки в обоих файлах совпадают, то только одна из них добавится.
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 11:15 23
Цитата Сообщение от Deviaphan Посмотреть сообщение
В обоих вариантах есть косяк, кажется. Если строки в обоих файлах совпадают, то только одна из них добавится.
Вам кажется, все учтено
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.10.2011, 11:18 24
Хорошо.) Просто сравнение if-else было похоже именно то, что я подумал.)
Сейчас уже понял, что добавляются же все строки и одинаковые тоже добавятся чуть позже. Тупанул.
0
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
Эксперт С++
4267 / 2241 / 203
Регистрация: 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
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 11:50  [ТС] 27
Вы меня извините за назойливость, но все же в результ файле у меня все тоже самое.
Прописываю пути в разные места и все равно все одно и тоже.
Я работаю в Dev-C++ - может быть дело в этом?
Я уже все пересмотрела - не меняются местами сроки и все тут.
Результ файл создается, информация туда пишется, но такое ощущение, что просто из файлов, обходя сортировку.
Для функции tolower подключила модуль #include <ctype.h>.
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 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
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 12:03  [ТС] 29
СПАСИБО ОГРОМНОЕ!
Сейчас все заработало.
Дело в том, что при сравнении двух строк строки д.б. одной длинны. У меня строка одна во втором файле была короче всех остальных.
При выводе строки сейчас переставляются, но между предпоследней строкой и последней стоит пустая строка, но с этим уж я сама попробую разобраться.

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

Добавлено через 1 минуту
Цитата Сообщение от Iska Посмотреть сообщение
но между предпоследней строкой и последней стоит пустая строка
в последней версии программы все учтено и красиво выводится.
0
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 16
07.10.2011, 12:09  [ТС] 31
Цитата Сообщение от Thinker Посмотреть сообщение
Ну, смотрите сами, программа работает со строками произвольной длины.
Попробую поэкспериментировать.
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 12:12 32
Цитата Сообщение от Iska Посмотреть сообщение
Попробую поэкспериментировать.
Напишите о результатах, очень интересно. Только учтите, если вы в программе что-то меняете, то это на вашей совести
0
Заблокирован
Автор FAQ
07.10.2011, 12:37 33
Цитата Сообщение от 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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <stdio.h>  //i/o
#include <string.h> //strtok
#include <stdlib.h> //malloc
#include <conio.h>
 
int main()
{
    FILE * f;//Для организации файловых потоков
    char * sBuf1 = NULL;//указатель на текстовый блок с данными из 1-го файла
    char * sBuf2 = NULL;//указатель на текстовый блок с данными из 2-го файла
    long sLen1;//длина текстового блока с данными из 1-го файла
    long sLen2;//длина текстового блока с данными из 2-го файла
    long bLen1;//длина буфера строки из 1-го файла
    long bLen2;//длина буфера строки из 2-го файла
    char * str1, *str2, *str;//Буфферные переменные
    
    //Считываем в буффер 1-ый файл
    if(!(f = fopen("file1.txt","rb+")))
        printf("Error open file1.txt\r\n");
    else
    {
        //Получаем длинну 1-го файла
        fseek(f,0,SEEK_END);
        sLen1 = ftell(f);
        fseek(f,0,SEEK_SET);
        if(!(sBuf1 = (char *)malloc(sLen1 + 1)))
            printf("Error allocation memmory for sBuf1\r\n");
        else
        {
            fread(sBuf1,sLen1,1,f);
            sBuf1[sLen1] = '\0';//Убираем мусор вконце строки
            //при таком выделении памяти malloc он всегда есть :(
        }
        fclose(f);
    }
    //Считываем в буффер 2-ой файл
    if(!(f = fopen("file2.txt","rb+")))
        printf("Error open file2.txt\r\n");
    else
    {
        //Получаем длинну 1-го файла
        fseek(f,0,SEEK_END);
        sLen2 = ftell(f);
        fseek(f,0,SEEK_SET);
        if(!(sBuf2 = (char *)malloc(sLen2 + 1)))
            printf("Error allocation memmory for sBuf1\r\n");
        else
        {
            fread(sBuf2,sLen2,1,f);
            sBuf2[sLen2] = '\0';//Убираем мусор вконце строки
            //при таком выделении памяти malloc он всегда есть :(
        }
        fclose(f);
    }
    if(!(f = fopen("file12.txt","w")))
        printf("Error creation file12.txt\r\n");
    else
    {
        //Если всё считали работаем с текстовыми блоками фафлов
        if(sBuf1 != NULL && sBuf2 != NULL)
        {
            printf("\tStrings from files\r\n");
            //Разбиваем текстовые блоки не строки
            str1 = strchr(sBuf1,'\n');
            str2 = strchr(sBuf2,'\n');
            while(str1 != NULL && str2 != NULL)
            {
                //Каждый раз подрезаем текстовый блок
                //по первому найденному '\n'
                sBuf1[bLen1 = (strlen(sBuf1) - strlen(str1) - 1)] = '\0';
                sBuf2[bLen2 = (strlen(sBuf2) - strlen(str2) - 1)] = '\0';
                if(sBuf1[0] < sBuf2[0])
                {
                    printf("%s\n%s\n",sBuf1,sBuf2);
                    fprintf(f,"%s\n%s\n",sBuf1,sBuf2);
                }
                else
                {
                    printf("%s\n%s\n",sBuf2,sBuf1);
                    fprintf(f,"%s\n%s\n",sBuf2,sBuf1);
                }
                //Сдвигаем указатель в текстовых блоках
                //в позицию найденного '\n'
                sBuf1 += bLen1 + 2;
                sBuf2 += bLen2 + 2;
                str1 = strchr(sBuf1 + bLen1 + 1,'\n');
                str2 = strchr(sBuf2 + bLen2 + 1,'\n');
            }
            //В файлах может быть разное число строк
            //поэтому после while обязательно либо один 
            //из указателей str1(2) == NULL! либо
            //NULL равны оба
            //Если в файле для которого str == NULL
            //запишем его содержимое
            //не забываем также что строка str != NULL
            //содержит 1-м символом '\n'
            if(sBuf1 != NULL && sBuf2 != NULL)
            {
                if(str1)//Значит в sBuf2 - последня стркоа а в str1
                {       //очередная строка из sBuf1
                    if(str1[0] < sBuf2[0])
                    {
                        printf("%s\n%s",str1 + 1,sBuf2);
                        fprintf(f,"%s\n%s",str1 + 1,sBuf2);
                    }
                    else
                    {
                        printf("%s\n%s",sBuf2,str1 + 1);
                        fprintf(f,"%s\n%s",sBuf2,str1 + 1);
                    }
                    //Отвожу указатель вначало текстового блока sBuf2
                    sBuf2 += strlen(sBuf2);
                    sBuf2 -= sLen2;//Потом можно будет free применить
                }
                else//Наоборот осталась последняя стркоа в 1-м файле,
                    //а вот 2-м ещё строки
                {
                    if(str2[0] < sBuf1[0])
                    {
                        printf("%s\n%s",str2 + 1,sBuf1);
                        fprintf(f,"%s\n%s",str2 + 1,sBuf1);
                    }
                    else
                    {
                        printf("%s\n%s",sBuf1,str2 + 1);
                        fprintf(f,"%s\n%s",sBuf1,str2 + 1);
                    }
                    //Отвожу указатель вначало текстового блока sBuf1
                    sBuf1 += strlen(sBuf1);
                    sBuf1 -= sLen1;//Потом можно будет free применить
                }
            }
 
            //Далее запишем содержимое оставшегося файла
            if(str1)
                str = str1;
            else
                str = str2;
            printf("%s",str);
            fprintf(f,"%s",str);
            printf("\r\nWriting in file12.txt complete\r\n");
            
        }
        fclose(f);
    }
    printf("Press any key to continue\r\n");
    getch();
    //PS:Чистить память после sBuf1(2) не обязательно
    //мы всё равно программму завершаем и память под
    //sBuf1(2) уже сама ОС почистить может
    return 0;
}

file1.txt
agjfjhjf
clflhglf
egfh;lf


file2.txt
bkfhklgf
dkghkf


file12.txt = fil1+file2
agjfjhjf
bkfhklgf
egfh;lf
dkghkf
egfh;lf



Не по теме:

Следование строк в выходном файле file12.txt определяется этим условием

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(sBuf1[0] < sBuf2[0])
, мы можем сюда вставить любое нужное нам условие;)

Миниатюры
Работа с текстовыми файлами и строками  
0
easybudda
07.10.2011, 15:49
  #34

Не по теме:

Цитата Сообщение от Thinker Посмотреть сообщение
int Strcmp(char *s0, char *t0)
Просто на всякий случай: strcasecmp

1
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 15:52 35
Цитата Сообщение от easybudda Посмотреть сообщение

Не по теме:


Просто на всякий случай

Не по теме:

У меня эта функция еще одну функцию выполняет - удаление '\n', но все равно спасибо:)

0
07.10.2011, 15:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2011, 15:52
Помогаю со студенческими работами здесь

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

Работа с текстовыми файлами
Прошу помощи! Необходимо что б программа считывала данные из обычного текстового файла и...

Работа с текстовыми файлами
Дай текстовы файл F. Группы символов, розделены пропусками (одним или нескольками) или вообще их не...

работа с текстовыми файлами
подскажите пожалуйста как решить эти задачи методом для начинающего или где можно взять литературу...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru