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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.82
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
#1

Про функции и файлы - C++

23.08.2009, 16:34. Просмотров 6136. Ответов 50
Метки нет (Все метки)

Вобщем начал изучать С++ добрался до файлов задумал написать примитивный справочник телефонный с возможностью сохранения чтения и поиска в файле но это потом застопорился на вот таком моменте:
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
void save(ofstream f, char *n,char *i);
 
int main(){
 
    char s;
    char nom[31],im[31];
    char fn[81];
 
    cout << "\nVvedite file dlia sohranenia:\n";
    cin.getline(fn, 80);
 
    ofstream f(fn);
 
    if (!f) {
    cout << "File" << fn << "ne mojet bit otkrit";
    return -1;
    }
 
    while(1){
        cout << "\n Vvedite nomer: \n";
        cin.getline(nom,30);
        cout << "Vvedite Imia: \n";
        cin.getline(im,30);
        cout << "Sohranit v file? (y/n) \n";
        cin >> s;
        if (s=='y') save(f,nom,im);
        cout << "Prodoljit? (y/n)";
        cin >> s;
        if (s=='n') break;
    }
    return 0;
}
 
void save(ofstream f, char *n,char *i){
f << n << endl;
f << i << endl;
}
Выдает следующее...

------ Построение начато: проект: 1, Конфигурация: Debug Win32 ------
Компиляция...
main.cpp
c:\program files\microsoft visual studio 9.0\vc\include\fstream(803) : error C2248: std::basic_ios<_Elem,_Traits>::basic_ios: невозможно обратиться к private член, объявленному в классе "std::basic_ios<_Elem,_Traits>"
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
c:\program files\microsoft visual studio 9.0\vc\include\ios(151): см. объявление 'std::basic_ios<_Elem,_Traits>::basic_ios'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
Сообщение диагностики возникло в созданной компилятором функции "std::basic_ofstream<_Elem,_Traits>::basic_ofstream(const std::basic_ofstream<_Elem,_Traits> &)"
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
Журнал построения был сохранен в "file://c:\Documents and Settings\Admin\Мои документы\Visual Studio 2008\Projects\Cons\1\1\Debug\BuildLog.htm"
1 - ошибок 1, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

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

Заранее спасибо за помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
26.08.2009, 00:16  [ТС]     Про функции и файлы #41
Посоветуйте справочник по C++ и если можно ссылку где скачать
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
26.08.2009, 00:17     Про функции и файлы #42
Цитата Сообщение от Neo-n06 Посмотреть сообщение
Посоветуйте справочник по C++ и если можно ссылку где скачать
http://www.cplusplus.com/reference/
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
26.08.2009, 20:52  [ТС]     Про функции и файлы #43
Спасибо помогло сейчас покумекаю выложу код может кому понадобится

Добавлено через 57 минут
И так теперь получилось вот что
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
void save(fstream *f, char *n,char *i);
void zapis(fstream *f);
void chtenie(fstream *f);
bool FilEx(char *s);
 
int main(){
 
    char fn[81];
    char i[2]={'z'};
    
    
 
    cout << "\nVvedite file dlia sohranenia:\n";
    cin.getline(fn, 80);
    
    if(!FilEx(fn)){
    cout << "Takogo fila net. \n";
    cout << "Vi hotite sozdat file? (y/n)";
    cin.getline(i,2);
    if (i[0]='y') fstream f(fn,ios::out|ios::in);
    else return 0;
        }
    else {
    cout << "Takoi file uge est.";
    cout << "1. Dobavit zapis";
    cout << "2. Perezapisat file";
    cin.getline(i,2);
    if (i[0]='1') fstream f(fn,ios::out|ios::in | ios::app);
    else fstream f(fn,ios::out|ios::in | ios::trunc);
        }
    
while(i[0]!='3'){
 
    cout << "\nChto budem delat ? \n \n";
    cout << "1. Dobavit zapis; \n";
    cout << "2. Prosmotret file; \n";
    cout << "3. Viiti; \n";
    cin.getline(i,2);
 
    switch(i[0]){
        case '1' :
            zapis(&f);
            break;
        case '2' :
            chtenie(&f);
            break;
        default : 
            cout << "Takogo punkta net";
            break;
 
        }
    }
    return 0;
}
 
void save(fstream *f, char *n,char *i){
*f << n << endl;
*f << i << endl;
}
 
void zapis(fstream *f){
        
    char nom[30],im[30],p[2];
    
    while(1){
        cout << "\nVvedite nomer: \n";
        cin.getline(nom,30);
        cout << "Vvedite Imia: \n";
        cin.getline(im,30);
        save(f,nom,im);
        cout << "Prodoljit? (y/n)";
        cin.getline(p,2);
        if (p[0]=='n') break;
    }
}
 
 
void chtenie(fstream *f){
    char buf[30];
    int i=0;
    f->seekp(0);
    while(!f->eof()){
        i++;
        if (i%2!=0) cout << "Nomer : \n";
        else cout << "Imia : \n";
        f->getline(buf , 30);
 cout << buf << endl;
}
    }
 
bool FilEx(char *s){
    fstream f(s);
    if (f) return true;
    else return false;
    f.close;
}
Но пишет вот что почему то хотя f объявлен

------ Построение начато: проект: 1, Конфигурация: Debug Win32 ------
Компиляция...
main.cpp
c:\documents and settings\admin\мои документы\visual studio 2008\projects\cons\1\1\main.cpp(48) : error C2065: f: необъявленный идентификатор
c:\documents and settings\admin\мои документы\visual studio 2008\projects\cons\1\1\main.cpp(51) : error C2065: f: необъявленный идентификатор
c:\documents and settings\admin\мои документы\visual studio 2008\projects\cons\1\1\main.cpp(101) : error C3867: std::basic_fstream<_Elem,_Traits>::close: в вызове функции отсутствует список аргументов; используйте "&std::basic_fstream<_Elem,_Traits>::close" для создания указателя на член
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
Журнал построения был сохранен в "file://c:\Documents and Settings\Admin\Мои документы\Visual Studio 2008\Projects\Cons\1\1\Debug\BuildLog.htm"
1 - ошибок 3, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
26.08.2009, 21:05     Про функции и файлы #44
f объявлен в блоке с 29 по 36 строку.
Дальше догадаетесь?

Потом еще одна ошибка будет - символ & перед файловыми переменными не нужен, они и так как указатели.
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
26.08.2009, 21:07     Про функции и файлы #45
Код
bool FilEx(char *s){
        fstream f(s);
        if (f) return true;
        else return false;
        f.close;
}
1) Правильно: f.close()
2) f.close() никогда не выполнится, потому что раньше произойдет выход из функции.
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
26.08.2009, 21:34  [ТС]     Про функции и файлы #46
Цитата Сообщение от skvor Посмотреть сообщение
f объявлен в блоке с 29 по 36 строку.
Дальше догадаетесь?

Потом еще одна ошибка будет - символ & перед файловыми переменными не нужен, они и так как указатели.
Понятно ... переменная действует только внутри блока ..... хорошо тогда создам ее раньше как установить флаги в зависимости от условия?
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
30.08.2009, 03:39  [ТС]     Про функции и файлы #47
Вот что получилось в результате размышлений нашел функцию установки флагов но почему то программа не делает того что должна не создает файл или н еперезаписывает его почему подскажите пожалуйсто

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
#include <iostream>
#include <fstream>
 
using namespace std;
 
void save(fstream *f, char *n,char *i);
void zapis(fstream *f);
void chtenie(fstream *f);
bool FilEx(char *s);
 
int main(){
 
    char fn[81];
    char i[2]={'z'};
    fstream f;
    cout << endl << f.flags() << endl;
 
    cout << "\nVvedite file dlia sohranenia:\n";
    cin.getline(fn, 80);
    
    if(!FilEx(fn)){
    cout << "Takogo fila net. \n";
    cout << "Vi hotite sozdat file? (y/n)";
    cin.getline(i,2);
    if (i[0]='y'){
        f.setf(ios::in | ios::out);
    }
    else return 0;
    }
    else {
    cout << "Takoi file uge est.\n";
    cout << "1. Dobavit zapis\n";
    cout << "2. Perezapisat file\n";
    cin.getline(i,2);
    if (i[0]='1') f.setf(ios::in | ios::out);
    else f.setf(ios::in | ios::out | ios::trunc);
        }
    cout << endl << f.flags() << endl;
    
while(i[0]!='3'){
 
    cout << "\nChto budem delat ? \n \n";
    cout << "1. Dobavit zapis; \n";
    cout << "2. Prosmotret file; \n";
    cout << "3. Viiti; \n";
    cin.getline(i,2);
 
    switch(i[0]){
        case '1' :
            zapis(&f);
            break;
        case '2' :
            chtenie(&f);
            break;
        default : 
            cout << "Takogo punkta net";
            break;
 
        }
    }
    return 0;
}
 
void save(fstream *f, char *n,char *i){
*f << n << endl;
*f << i << endl;
}
 
void zapis(fstream *f){
        
    char nom[30],im[30],p[2];
    
    while(1){
        cout << "\nVvedite nomer: \n";
        cin.getline(nom,30);
        cout << "Vvedite Imia: \n";
        cin.getline(im,30);
        save(f,nom,im);
        cout << "Prodoljit? (y/n)";
        cin.getline(p,2);
        if (p[0]=='n') break;
    }
}
 
 
void chtenie(fstream *f){
    char buf[30];
    int i=0;
    f->seekp(0);
    while(!f->eof()){
        i++;
        if (i%2!=0) cout << "Nomer : \n";
        else cout << "Imia : \n";
        f->getline(buf , 30);
 cout << buf << endl;
}
    }
 
bool FilEx(char *s){
    fstream f(s);
    if (f){ 
        return true;
        f.close();
    }
    else{ 
        return false;
        f.close();
    }
}
Mozart
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
30.08.2009, 10:09     Про функции и файлы #48
C++
1
2
3
        else{ 
                return false;
                f.close();
То же самое после команды return функция прекращает свое выполнение т.е. f.close(); не выполняется, поменяйте эти строчки местами.
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
30.08.2009, 13:09  [ТС]     Про функции и файлы #49
Дело не в этой строчке функция работает нормально ... хотя местами поменял ...
А вот программа компилится но работает не так как надо ... жму в меню создать файл она его не создает просто напросто или не перезаписывает вопрос почему? хотя флаги вроде так выставил
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
30.08.2009, 14:54     Про функции и файлы #50
Цитата Сообщение от Neo-n06 Посмотреть сообщение
жму в меню создать файл она его не создает
Читайте книжку, сам точно сказать не могу, не помню. Файлы можно "открывать существующий" и "открывать новый". Это делается разными методами или с разными ключами. В любом случае, если "создавать новый", а он уже есть, то файл не откроется и не создастся, и укзатель на такой файл (после попытки открыть) будет false-ом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2009, 19:52     Про функции и файлы
Еще ссылки по теме:

C++ Про указатели с использованием функции
C++ Задача про массивы и функции
C++ Задача про ГАИ и файлы (где накосячил в коде?)
C++ Еще раз про setw: не определяется, хотя все файлы импортированы
C++ Про файлы .dll

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

Или воспользуйтесь поиском по форуму:
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
30.08.2009, 19:52  [ТС]     Про функции и файлы #51
Вот текст работующей программы :
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
void save(fstream *f, char *n,char *i);
void zapis(fstream *f);
void chtenie(fstream *f);
bool FilEx(char *s);
 
int main(){
 
    char fn[81];
    char i[2]={'z'};
    cout << "\nVvedite file dlia sohranenia:\n";
    cin.getline(fn, 80);
    fstream f;
 
    if(!FilEx(fn)){
    cout << "Takogo fila net. \n";
    cout << "Vi hotite sozdat file? (y/n)";
    cin.getline(i,2);
    if (i[0]=='y')  f.open(fn, ios::in | ios::out | ios::trunc);
    else return 0;
    }
    else {
    cout << "Takoi file uge est.\n";
    cout << "1. Dobavit zapis\n";
    cout << "2. Perezapisat file\n";
    cin.getline(i,2);
    if (i[0]='1') f.open(fn , ios::in | ios::out | ios::app);
    else f.open(fn, ios::in | ios::out | ios::trunc);
        }
    
while(i[0]!='3'){
    system("cls");
    cout << "\nChto budem delat ? \n \n";
    cout << "1. Dobavit zapis; \n";
    cout << "2. Prosmotret file; \n";
    cout << "3. Viiti; \n";
    cin.getline(i,2);
 
    switch(i[0]){
        case '1' :
            zapis(&f);
            break;
        case '2' :
            chtenie(&f);
            break;
        case '3':
            return 0;
        default : 
            cout << "Takogo punkta net";
            cin.get();
            break;
 
        }
    }
    return 0;
}
 
void save(fstream *f, char *n,char *i){
*f << n << endl;
*f << i << endl;
}
 
void zapis(fstream *f){
        
    char nom[30],im[30],p[2];
    system("cls");
    
    while(1){
        cout << "\nVvedite nomer: \n";
        cin.getline(nom,30);
        cout << "Vvedite Imia: \n";
        cin.getline(im,30);
        save(f,nom,im);
        cout << "Prodoljit? (y/n)";
        cin.getline(p,2);
        if (p[0]=='n') break;
    }
}
 
 
void chtenie(fstream *f){
    system("cls");
    char buf[30];
    char p[3];
    int i=0;
    f->seekp(0);
    while(!f->eof()){
        i++;
        if (i%2!=0) cout << "Nomer : \n";
        else cout << "Imia : \n";
        f->getline(buf , 30);
 cout << buf << endl;
 if (i%5==0) {
     cout << "Vivesti eshe ? (y/n)";
    cin >> p;
     if (p[0] == 'n') break;
     else system("cls");
 }
}
    cin.get();
    }
 
bool FilEx(char *s){
    fstream f(s);
    if (f){ 
        return true;
        f.close();
    }
    else{
        f.close();
        return false;
    }
}
Yandex
Объявления
30.08.2009, 19:52     Про функции и файлы
Ответ Создать тему
Опции темы

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