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

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

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

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

23.08.2009, 16:34. Просмотров 6295. Ответов 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 ==========

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

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

Вопрос про файлы - C++
где распологать текстовый файл, чтобы программа видела его сразу без прописания директории? пишу в VS

Про файлы .dll - C++
Здравствуйте, я заинтересовался фалами .dll. Я заметил, что в некоторых приложениях скачивают эти файлы(обычно названиеx64.dll и...

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

не могли бы вы проверить задачу про двоичные файлы? - C++
Всем здравствуйте. наверно немного странная просьба: проверьте на правильность задачку &quot;вывод числа из двоичного файла&quot;, просто сомневаюсь...

Задача про ГАИ и файлы (где накосячил в коде?) - C++
Добрый день! Задача звучит так: Вдоль шоссе в точках X1,X2,...,XN расположены посты ГАИ. В точке X произошло мелкое ДТП...

Еще раз про setw: не определяется, хотя все файлы импортированы - C++
скрины как решилась проблема.

50
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.08.2009, 01:32 #16
Цитата Сообщение от Neo-n06 Посмотреть сообщение
Да вы правы ступил я спасибо...

А по поводу того что во второй раз не дает вводить номер что скажите?
не, никаких идей. я с этим набором ф-й что-то делал только когда еще учебники читал, после ни разу не приходилось.
0
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
24.08.2009, 07:28 #17
Цитата Сообщение от Neo-n06 Посмотреть сообщение
А по поводу того что во второй раз не дает вводить номер что скажите?
В своё время, я сам с чем-то подобным тупил, и, честно говоря, не помню точно чем дело кончилось.
Там что-то где-то с концами строк, т.е., к примеру, функция/метод должна читать до конца строки, но сам конец строки из потока не вынимается, следовательно к следующему вызову эта функция видя маркер конца, возвращает пустую строку, но дальше не движется.

Попробуйте использовать функцию getline, но не метод из cin-а.
И не работайте с потоком разными функциями/методами, т.е. если в одном месте читаете по строкам, то и в других местах, с тем же потоком используйте только эту функцию.

Нормальное чтение файла по строкам, примерно так
C++
1
2
3
4
5
std::ifstream F("имя_файла");
std::string Buf;
while (getline(F,Buf)) //Цикл чтения пока не кончится файл
  { //Что-то делаем с Buf, в который записана строка из файла
  }
0
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
24.08.2009, 11:33  [ТС] #18
getline в какой библиотеке находится?
0
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
24.08.2009, 12:13 #19
Цитата Сообщение от Neo-n06 Посмотреть сообщение
getline в какой библиотеке находится?
#include <string>
1
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
24.08.2009, 12:59  [ТС] #20
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
void save(fstream *f, string n,string i);
 
int main(){
 
    string nom,im,s,p;
    char fn[81];
 
    
    cout << "\nVvedite file dlia sohranenia:\n";
    cin.getline(fn, 80);
 
    fstream f(fn);
 
    if (!f) {
    cout << "File" << fn << "ne mojet bit otkrit";
    return -1;
    }
 
    while(1){
        cout << "Vvedite nomer: \n";
        getline(cin,nom);
        cout << "Vvedite Imia: \n";
        getline(cin,im);
        cout << "Sohranit v file? (y/n) \n";
        getline(cin,s);
        if (s[0]=='y') save(&f,nom,im);
        cout << "Prodoljit? (y/n)";
        getline(cin,p);
        if (p[0]=='n') break;
    }
    return 0;
}
 
void save(fstream *f, string n,string i){
*f << n << endl;
*f << i << endl;
}
Работает спасибо

С тем вариантом тоже надо будет поввозиться интересно почему так...

Добавлено через 17 минут
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
void save(fstream *f, char *n,char *i);
 
int main(){
 
    char nom[30],im[30],s[2],p[2];
    char fn[81];
 
    
    cout << "\nVvedite file dlia sohranenia:\n";
    cin.getline(fn, 80);
 
    fstream f(fn);
 
    if (!f) {
    cout << "File" << fn << "ne mojet bit otkrit";
    return -1;
    }
 
    while(1){
        cout << "Vvedite nomer: \n";
        cin.getline(nom,30);
        cout << "Vvedite Imia: \n";
        cin.getline(im,30);
        cout << "Sohranit v file? (y/n) \n";
        cin.getline(s,2);
        if (s[0]=='y') save(&f,nom,im);
        cout << "Prodoljit? (y/n)";
        cin.getline(p,2);
        if (p[0]=='n') break;
    }
    return 0;
}
 
void save(fstream *f, char *n,char *i){
*f << n << endl;
*f << i << endl;
}
Вот рабочая версия с типом char[] Причина крылась вот в чем >> не так как надо добавляет символ завершения строки то есть \0 в результате получается пустая строка ..... хотя s и был простой char и символ завершения строки ему не нужен но да ладно ... еще раз всем спасибо буду развивать программу дальше
0
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
24.08.2009, 15:11  [ТС] #21
После некоторых размышлений получилось вот что :
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
#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);
 
int main(){
 
    char fn[81];
    char i[2]={'z'};
    
    
 
    cout << "\nVvedite file dlia sohranenia:\n";
    cin.getline(fn, 80);
 
    fstream f(fn);
 
    if (!f) {
    cout << "File" << fn << "ne mojet bit otkrit";
    return -1;
    }
    
    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;
}
    }
Появился такой вопрос как обратиться к консоли именно хочу ее очистить и еще как проверить существует ли запршиваемый файл или нет ?

Посоветуйте что добавить еще ... это я как бы себе экзамен устроил напишу программу и перейду к изучению ООП
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
24.08.2009, 15:21 #22
Цитата Сообщение от Neo-n06 Посмотреть сообщение
Появился такой вопрос как обратиться к консоли именно хочу ее очистить
C++
1
2
system("cls"); // для windows
system("clear"); // для linux
Цитата Сообщение от Neo-n06 Посмотреть сообщение
как проверить существует ли запршиваемый файл или нет ?
в C++ Builder по-моему есть функция FileExists(). Но обычно делают так:
Цитата Сообщение от Neo-n06 Посмотреть сообщение
fstream f(fn);
if (!f) {
cout << "File" << fn << "ne mojet bit otkrit";
return -1;
}
как правило, если файл не может быть открыт - значит он несуществует (шанс других вариантов 0.1%).
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
24.08.2009, 15:30 #23
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
как правило, если файл не может быть открыт - значит он несуществует (шанс других вариантов 0.1%)
Или существует, но нет прав на его чтение, что тоже нередкость.
0
M128K145
Эксперт С++
8289 / 3509 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
24.08.2009, 15:34 #24
ОЧистка консоли как и обычной cmd
C++
1
system("cls");
Проверить файл можно вот так
C++
1
2
3
ifstream inputStream(path, ios::in);
if (!inputStream)
        std::cout << "Ошибка открытия файла";
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
24.08.2009, 15:35 #25
Цитата Сообщение от Gravity Посмотреть сообщение
Или существует, но нет прав на его чтение, что тоже нередкость.
Можешь зааттачить такой файл?
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
24.08.2009, 15:40 #26
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Можешь зааттачить такой файл?
Эм, а смысл? Насчет винды не знаю, а в линухе ты и сам можешь найти такие файлы сделав find / -name 'test' под обычным юзером, наверняка получишь ряд каталогов с отказом доступа.
0
M128K145
Эксперт С++
8289 / 3509 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
24.08.2009, 15:57 #27
Monte-Cristo, в винде возможен такой случай, допустим человек зашел под юзером, а пытается получить доступ к файлу \Documents and Settings\Administrator\ntuser.ini Он точно знает, что файл там есть, только вот прав на его прочтение у него нету. Возможно пример не самый удачный, но смысл такой
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
24.08.2009, 16:01 #28
M128K145, файл ему не доступен. В этом случае, он для него как-бы несуществует. В этом случае, FileExists тоже не будет работать. Иного случая нет
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
24.08.2009, 16:06 #29
Вобще, хорошая функция в случае облома должна устанавливать значение errno, по которому можно определить что произошло: нет файла, нет доступа или еще что.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.08.2009, 16:46 #30
Цитата Сообщение от Neo-n06 Посмотреть сообщение
как проверить существует ли запршиваемый файл или нет ?
sudbonosnyj vopros: za4em?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2009, 16:46
Привет! Вот еще темы с ответами:

Задача про массивы и функции - C++
Напишите программу, которая запрашивает у пользователя 10 результатов игры в гольф, сохраняя их в массиве. При этом необходимо обеспечить...

strcmp в функции ...(про поезда) - C++
Вывод на экран поездов отправляющихся после введённого с клавиатуры времени... Сообственно подводит if в 94 строке который выводит не...

Вопрос про аргументы функции - C++
Если функция не принимает никаких значений можно ли писать так? int GetAge(void) {return age;} я про void в скобках

Про указатели с использованием функции - C++
Вопросы в комментариях к коду #include &lt;iostream&gt; #include &lt;cctype&gt; #include &lt;cstring&gt; using namespace std; void...


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

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

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