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

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

Войти
Регистрация
Восстановить пароль
 
 
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
#1

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

03.10.2010, 18:24. Просмотров 1110. Ответов 16
Метки нет (Все метки)

Привет всем!
Может кто помочь, как работать с файлами (открыть, закрывать, читать из файла, записывать в файл)через классы, объяснить на примере?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2010, 18:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с файлом через классы (C++):

Работа с файлом через класс - C++
Доброй ночи всем! Хочу реализовать открытие файла для чтения из конструктора класса CTextFile: #ifndef ___TEXT_FILE___ #define...

работа с файлом через входной параметр - C++
int _tmain(int argc,char* argv) { FILE* F =fopen(argv, "wt+"); когда пишу параметр запуская через командную строку или ярлык,...

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

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

Работа с файлом - C++
Ранее уже выкладывал код. Поизменял. Поиск разработал. Но ни фига не работает)). Помогите найти. пожалуйста ошибку. В майне цикл не...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
03.10.2010, 20:09 #2
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
#include <iostream>
using namespace std;
class ReadText{
    char **str;
    int count;
public:
    ReadText(){
        count=0;
        str=new char*[100];
        for(int i=0;i<100;i++)
            str[i]=new char[50];
    }
    ~ReadText(){
        for(int i=0;i<100;i++)
            delete []str[i];
        delete []str;
    }
    void ReadFile();
    void SaveFile();
    void Show();
};
void ReadText::ReadFile(){
    const int size=65536;
    FILE *f_in=fopen("text.txt","r+");      //открытие файла
    if(!f_in)
        exit(0);
    while(!feof(f_in)){
        fread(str[count],sizeof(char),size,f_in);       //чтение файла
        count++;
    }
    fclose(f_in);       //закрытие файла
 
}
void ReadText::SaveFile(){
    const int size=65536;
    FILE *f_out=fopen("output.txt","w+");
    if(!f_out)
        exit(0);
    for(int i=0;i<count;i++)
        fwrite(str[count],sizeof(char),size,f_out);     //запись в файл
    fclose(f_out);
}
void ReadText::Show(){
    for(int i=0;i<count;i++)
        cout<<str[i]<<endl;
}
void main()
{
    ReadText ob;
    ob.ReadFile();
    ob.Show();
    ob.SaveFile();
}
1
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
03.10.2010, 21:03  [ТС] #3
А как вот сделать что бы он по символу считывал? потому что мне потом слова там сортировать нужно)))

Добавлено через 46 минут
Вот написал, но что то не работает, помогите найти ошибки))
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
#include <iostream> 
#include <string.h>
#include <iostream>
using namespace std;
 
class first{
    FILE* in;
    FILE* out;
    char *mass;
    public:
        first(){
            char *mass = new char[255];
        };
 
        void file_open(char *f);
 
        ~first(){
            delete [] mass;
        };
};
 
void first::file_open(char *f){
    while(true){
    cout<<"Введите имя файла: ";
    cin>>f;
    in=fopen(f,"r");
        if (!f){
            cout<<"Ошибка имени файла!"<<endl;
            continue;
        }
        else break;
    }
    while(!feof(in)){
        for(int i=0; i<255; i++){
            fscanf(in,"%1c",mass[i]);
        }
        for (int i=0; i<255; i++){
            cout << mass[i];
        }
    }
    fclose(in);
}
 
 
 
int main(){
    setlocale(LC_ALL,"Russian");
    char f[255];
    first worker;
    worker.file_open(f);
    
return 0;
}
0
KuKu
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,985
03.10.2010, 21:11 #4
fscanf(in,"%1c",mass[i]);
%1c а такой спецификатор типа есть ? Ошибки то какие пишет ?
0
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
03.10.2010, 21:15 #5
создавайте не массив а матрицу, я в своем примере не зря создал матрицу, так как слова считываются целиком, а сортировать можно так
if(str[i][0]>str[i+i][o])
действие.....

т.е. сортировка по 1му символу слова
0
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
03.10.2010, 21:24  [ТС] #6
Цитата Сообщение от Crudelis Посмотреть сообщение
создавайте не массив а матрицу, я в своем примере не зря создал матрицу, так как слова считываются целиком, а сортировать можно так
if(str[i][0]>str[i+i][o])
действие.....

т.е. сортировка по 1му символу слова
Дак у вас вроде он блоками читает, ну типо строками.
И как то же нужно задавать размер массив, потому что кто знает сколько слов в файле
0
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
03.10.2010, 21:37 #7
текст из файла считывается либо по пробелу, либо по символам препинания, у меня создается массив
C++
1
2
3
str=new char*[100];             //100 слов
                for(int i=0;i<100;i++)
                        str[i]=new char[50];           //в слове максимум 50 символов
в коде я сделал ошибки:
C++
1
2
3
fread(str[count][50],sizeof(char),size,f_in);  
///
fwrite(str[count][50],sizeof(char),size,f_out);
0
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
03.10.2010, 21:46  [ТС] #8
что означает в вашем коде
C++
1
...sizeof(char),size...
0
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
03.10.2010, 23:40 #9
fread( void *buffer, size_t size, size_t count, FILE *stream )

buffer - адрес массива, куда запишутся данные

size - размер элемента массива в байтах

count - максимальное количество элементов для считывания

stream - указатель на открытый файл.


fwrite( const void *buffer, size_t size, size_t count, FILE *stream )

buffer - адрес массива, где содержатся данные

size - размер элемента массива в байтах

count - максимальное количество элементов для записи в файл

stream - указатель на открытый файл.

Можно использовать другое чтение файла, которое более проще:
C++
1
2
3
4
5
6
7
8
9
10
11
#include<fstream>
.................
 
ifstream f_in;
    f_in.open("text.txt");
    f_in >> a[1][1];
    f_in.close();
ofstream f_out;
f_out.open(outp.txt);
f_out << a[1][1];
f_out.close();
0
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
03.10.2010, 23:48  [ТС] #10
Я как то не оч это понимаю. Я вот написал свое, но че то он не хочет нормально выдавать значения.
код:
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
#include <iostream> 
#include <string.h>
#include <iostream>
using namespace std;
 
class first{
    FILE* in;
    FILE* out;
    char **mass;
    int coun;
    char str;
    public:
        first(){
            coun=0;
            mass=new char*[255];
            for(int i=0;i<255;i++)
                mass[i]=new char[50];
        };
 
        void file_open(char *f);
 
        ~first(){
            for(int i=0;i<255;i++)
                delete []mass[i];
            delete []mass;
        };
};
 
void first::file_open(char *f){
    while(true){
        char str;
        cout<<"Введите имя файла: ";
        cin>>f;
        in=fopen(f,"r");
            if (!in){
                cout<<"Ошибка имени файла!"<<endl;
                continue;
            }
            else break;
        }
        int j=0, k=0;
        for (int i=0;i<50; i++){k++;
            fscanf(in,"%1c",&str);
            if (str==' ') {coun++; j++;}
            else mass[coun][i]=str;
            if (feof(in)) break;
        }
        for (coun=0; coun<=j; coun++){
            for (int i=0; i<k; i++){
                cout << mass[coun][i];
            }
            cout<< endl;
        }
    fclose(in);
}
 
 
 
int main(){
    setlocale(LC_ALL,"Russian");
    char f[255];
    first worker;
    worker.file_open(f);
    
return 0;
}
В файле у меня написано так:
папа мама
Через табуляцию (если через пробелы то там ваще хрень)
Вот что выдает:
0
Миниатюры
Работа с файлом через классы  
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
03.10.2010, 23:53  [ТС] #11
Я просто хочу, что бы он считал одно слово до пробела, потом второе и т.д.
0
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
04.10.2010, 01:01 #12
robert19, выше я писал что когда в тексте встречается пробел то он не считывается, для чего вы делаете вот эту проверку?
C++
1
if (str==' ') {coun++; j++;}
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
#include <iostream> 
#include <string.h>
#include <iostream>
using namespace std;
 
class first{
        FILE* in;
        FILE* out;
        char **mass;
        int coun;
        char str;
        public:
                first(){
                        coun=0;
                        mass=new char*[255];
                        for(int i=0;i<255;i++)
                                mass[i]=new char[50];
                };
 
                void file_open(char *f);
 
                ~first(){
                        for(int i=0;i<255;i++)
                                delete []mass[i];
                        delete []mass;
                };
};
 
void first::file_open(char *f){
        while(true){
                char str;
                cout<<"Введите имя файла: ";
                cin>>f;
                in=fopen(f,"r");
                        if (!in){
                                cout<<"Ошибка имени файла!"<<endl;
                                continue;
                        }
                        else break;
                }
                int j=0, k=0;
                for (int i=0;i<50; i++){
                        k++;
                        fscanf(in,"%c",&str);
                        mass[coun][i]=str;
                        if (feof(in)) break;
                }
 
                        for (int i=0; i<k-1; i++){
                                cout << mass[coun][i];
                        }
                        cout<< endl;
 
        fclose(in);
}
 
 
 
int main(){
        setlocale(LC_ALL,"Russian");
        char f[255];
        first worker;
        worker.file_open(f);
        
return 0;
}
0
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
04.10.2010, 09:00  [ТС] #13
C++
1
if (str==' ') {coun++; j++;}
Потому что слова считываются в одну строку. Их потом местами не поменять, т.е. по алфавиту не отсортировать

Добавлено через 1 час 55 минут
Парни помогите кто нить сделать этот массив слов. что бы их потом можно было отсортировать (по алфавиту) и обратно в файл записать. Я уже 2-й день сижу, никак не получается
0
NightmareZ
1340 / 563 / 37
Регистрация: 31.03.2009
Сообщений: 1,919
04.10.2010, 10:03 #14
Убиться. Что ж вы за ересь такую пишете? Кто на C++ так с файлами работает?

Цитата Сообщение от robert19 Посмотреть сообщение
А как вот сделать что бы он по символу считывал? потому что мне потом слова там сортировать нужно)))
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
#include <fstream>
#include <iostream>
#include <vector>
#include <iterator>
#include <string>
#include <algorithm>
 
typedef std::vector<std::string> Vec;
 
int main()
{
    // Считали файл.
    std::ifstream inputFile("test.txt", std::ios_base::in);
    Vec arr(
        (std::istream_iterator<Vec::value_type>(inputFile)),
        (std::istream_iterator<Vec::value_type>())
    );
 
    // Отсортировали.
    std::sort(arr.begin(), arr.end(), 
        [](const Vec::value_type& a, const Vec::value_type& b) { return b.compare(a) > 0; });
 
    // Вывели на экран.
    for (Vec::iterator s = arr.begin(); s != arr.end(); s++)
        std::cout << (*s).c_str() << std::endl;
}
0
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
04.10.2010, 10:15  [ТС] #15
Цитата Сообщение от NightmareZ Посмотреть сообщение
Убиться. Что ж вы за ересь такую пишете? Кто на C++ так с файлами работает?
Не, мне нужно через классы. Вот написал. С файла считывает слова как нужно, но терь отсортировать не могу.

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
#include <iostream> 
#include <string.h>
#include <iostream>
 
using namespace std;
 
class Read{
    private:
        FILE* in;
        FILE* out;
        int n;
        char str[50][50];
       
    public:
        Read(){
            n=0;
        };
        void FileOpen(char *f);
        void TextSort();
        void SaveFile(char *f);
 
};
 
void Read::FileOpen(char *f){
    while(true){
        char str;
        cout<<"Введите имя файла: ";
        cin>>f;
        in=fopen(f,"r");
        if (!in){
            cout<<"Ошибка имени файла!"<<endl;
            continue;
        }
        else break;
    }
 
    while (true){
        fscanf(in,"%s",&str[n]);
        if (feof(in))
            break;
        n++;
    }
 
    for(int i=0;i<n;i++){
        cout<<str[i];
        cout<<endl;
    }
 
    fclose(in);
}
 
void Read::TextSort(){
    char mass;
    for (int i=0; i<n; i++){
        if (str[i]>str[i+1]){
            mass=str[i];
            str[i]=str[i+1];  //1>main.cpp(57): error C2106: =: левый операнд должен быть левосторонним значением
            str[i+1]=mass;  //1>main.cpp(58): error C2440: =: невозможно преобразовать "char" в "char [50]"
        }
    }
    for (int i=0; i<n; i++){
        cout<<str[i];
    }
}
 
int main(){
    setlocale(LC_ALL,"Russian");
    char f[255];
    Read w;
    w.FileOpen(f);
        w.TextSort();
        
return 0;
}
Ошибки я вон в коде закоментил))
И мы потоки как бы еще не изучали
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2010, 10:15
Привет! Вот еще темы с ответами:

Работа с файлом - C++
Программа для записи/прочитки текстовых файлов. Почему когда ввожу строку, в файл сохраняется только часть строки(до первого пробела)? ...

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

Работа с файлом - C++
Файл не открывается для чтения..... программа создает алфавит для исходного текста....помогите пожалуйста..:( Уже все перепробовала.... ...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.10.2010, 10:15
Ответ Создать тему
Опции темы

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