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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Помогите доделать программу так, чтобы она соответствовала следующим требованиям http://www.cyberforum.ru/cpp-beginners/thread362469.html
Память под хранение элементов массива должна выделяться динамически с помощью оператора new (освобождаться – с помощью delete), размер выделяемой памяти должен определяться программой автоматически по содержимому файла (а не вводиться пользователем с клавиатуры). Весь ввод/вывод (файл, консоль) – с помощью потоков. Имя файла с элементами массива должно вводиться пользователем с клавиатуры....
C++ Ошибка при компиляции виртуальные функции error LNK2001: неразрешенный внешний символ ""public: virtual float_thiscall Operator::getNumber(void)" (?getNubmer@Operator@@UAEMXZ)" error LNK2001: неразрешенный внешний символ ""public: virtual char_thiscall Number::getOperator(void)" (?getOperator@Number@@UAEMXZ)" error LNK1120: 2 неразрешенных элементов #include<iostream> #include<cstring> using namespace std; http://www.cyberforum.ru/cpp-beginners/thread362462.html
"Не хочу константу!" C++
Здравствуйте. Компилятор (пишу в wxDev-C++) ругается на такой код #ifndef LIFE_H #define LIFE_H class Life { public: Life (); // конструктор int around ( int, int ); // считает, сколько клеток вокруг
C++ помогите разобраться с библиотекой и в чем ошибка?
Это метод Якоби #include "stdafx.h" #include <math.h> #include "nrutil.h" /* Здесь определяются некоторые утилиты типа выделения памяти */ /* Преобразование элементов при ротации */ #define ROTATE(a,i,j,k,l) g=a;h=a;a=g-s*(h+g*tau);a=h+s*(g-h*tau) /* максимальное число проходов */ #define MAXSWEEP 50
C++ поиск в ширину(Рекурсивный) http://www.cyberforum.ru/cpp-beginners/thread362455.html
Программа запускается но выдает ошибку(Задача такая: Создать программу для решения задачи построения слова из некоторого множества букв (игра Scrabble) используя алгоритмы поиска в глубину и в ширину. Длина слова не менее 5 букв. ) Код программы #include "stdafx.h" #include <iostream> #include <string> #include <Windows.h> using namespace std; string str1 = "forum"; // string str2...
C++ рекурсивные классы Доброго времени суток. Скажите пожалуйста, можно ли при написании класса объявить в нём поле того же типа что и сам класс? Компилятор ругается на такое, но может это возможно по другому? class car { ... car lada; ... }; подробнее

Показать сообщение отдельно
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2011, 12:37     Работа с текстовыми файлами и строками
Цитата Сообщение от 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])
, мы можем сюда вставить любое нужное нам условие

Миниатюры
Работа с текстовыми файлами и строками  
 
Текущее время: 14:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru