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

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

Восстановить пароль Регистрация
 
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
03.10.2010, 18:24     Работа с файлом через классы #1
Привет всем!
Может кто помочь, как работать с файлами (открыть, закрывать, читать из файла, записывать в файл)через классы, объяснить на примере?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2010, 18:24     Работа с файлом через классы
Посмотрите здесь:

работа с файлом) C++
C++ Работа с файлом. С++
Работа с файлом C++
C++ Работа с файлом через класс
Работа с файлом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 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();
}
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;
}
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
03.10.2010, 21:11     Работа с файлом через классы #4
fscanf(in,"%1c",mass[i]);
%1c а такой спецификатор типа есть ? Ошибки то какие пишет ?
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
03.10.2010, 21:15     Работа с файлом через классы #5
создавайте не массив а матрицу, я в своем примере не зря создал матрицу, так как слова считываются целиком, а сортировать можно так
if(str[i][0]>str[i+i][o])
действие.....

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

т.е. сортировка по 1му символу слова
Дак у вас вроде он блоками читает, ну типо строками.
И как то же нужно задавать размер массив, потому что кто знает сколько слов в файле
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 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);
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
03.10.2010, 21:46  [ТС]     Работа с файлом через классы #8
что означает в вашем коде
C++
1
...sizeof(char),size...
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 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();
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;
}
В файле у меня написано так:
папа мама
Через табуляцию (если через пробелы то там ваще хрень)
Вот что выдает:
Миниатюры
Работа с файлом через классы  
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
03.10.2010, 23:53  [ТС]     Работа с файлом через классы #11
Я просто хочу, что бы он считал одно слово до пробела, потом второе и т.д.
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 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;
}
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
04.10.2010, 09:00  [ТС]     Работа с файлом через классы #13
C++
1
if (str==' ') {coun++; j++;}
Потому что слова считываются в одну строку. Их потом местами не поменять, т.е. по алфавиту не отсортировать

Добавлено через 1 час 55 минут
Парни помогите кто нить сделать этот массив слов. что бы их потом можно было отсортировать (по алфавиту) и обратно в файл записать. Я уже 2-й день сижу, никак не получается
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
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;
}
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;
}
Ошибки я вон в коде закоментил))
И мы потоки как бы еще не изучали
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
04.10.2010, 10:51     Работа с файлом через классы #16
Цитата Сообщение от robert19 Посмотреть сообщение
Не, мне нужно через классы.
Это называется через "жо", а не через классы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2010, 15:10     Работа с файлом через классы
Еще ссылки по теме:

C++ Работа с текстовым файлом (название файлы через переменную)
Работа с файлом C++
C++ работа с файлом через входной параметр

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

Или воспользуйтесь поиском по форуму:
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
04.10.2010, 15:10  [ТС]     Работа с файлом через классы #17
Цитата Сообщение от NightmareZ Посмотреть сообщение
Это называется через "жо", а не через классы.
По другому не получается

Добавлено через 4 часа 18 минут
Больше ни у кого нет вариантов?
Yandex
Объявления
04.10.2010, 15:10     Работа с файлом через классы
Ответ Создать тему
Опции темы

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