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

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

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

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

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

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

Заранее спасибо за помощь.
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++
скрины как решилась проблема.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
24.08.2009, 17:07 #31
Цитата Сообщение от Neo-n06 Посмотреть сообщение
как проверить существует ли запршиваемый файл или нет ?
Это зависит от системы и прав доступа.
Буквально - существование файла в директории, можно определить прочитав директорию, при наличии прав чтения/поиска в этой директории.
А вот можно ли его будет открыть - не факт, это уже написали.
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
24.08.2009, 18:20  [ТС] #32
Про открыть понятно .... Зачем ... ну учусь ведь интересно как реализовать это ....
За консоль спасибо понял как сделать
Проверку на существование пока что не понял как сделать
Подскажите как прочитать дирректорию какой функцией?
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
24.08.2009, 18:29 #33
Цитата Сообщение от Neo-n06 Посмотреть сообщение
Подскажите как прочитать дирректорию какой функцией?
Зависит от системы, стандарта, как мне объяснили - нет.

На BSD у меня сделано так
C++
1
2
3
4
5
6
7
8
9
10
#include <dirent.h>
...........
dirent *dirbuf;
DIR *fddir=opendir("путь_с_директорией");
while (dirbuf=readdir(fddir))
{ dirbuf->d_ino; //"айнод" файла или субдиректории
  dirbuf->d_name; //имя файла или субдиректории
}
closedir(fddir);
..........
Пытался разобраться с потоками (что б было как C++), но чёт не компилируется библиотека.
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
24.08.2009, 18:38 #34
Тем не менее, вот здесь товарищ запускал юниксовый пример под виндой, наверно нашел dirent.h.
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
24.08.2009, 19:29  [ТС] #35
=) Неужели под винду нет такой функции? ... я в шоке но да ладно что нить придумаю
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
25.08.2009, 16:45  [ТС] #36
C++
1
2
3
4
5
6
7
8
9
10
    cout << "\nVvedite file dlia sohranenia:\n";
    cin.getline(fn, 80);
 
    fstream f(fn);
 
    if (!f) {
    
    cout << "File" << fn << "ne mojet bit otkrit";
    return -1;
    }
И так вот эта инструкция проверяет существует ли файл или нет если существует то открывает если нет выдает сообщение об ошибке и завершает программу теперь вопрос а как создать файл?

И еще вопрос что значат коды return 0 это помоему нормальное завершение программы а return -1 ? и какие они еще есть? ....

Скачал себе русскую Визуал студию 2008 ю (официальную) с русским МСДНом тоько что то он не весь рускский
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
25.08.2009, 17:25 #37
Цитата Сообщение от Neo-n06 Посмотреть сообщение
И так вот эта инструкция проверяет существует ли файл или нет если существует то открывает если нет выдает сообщение об ошибке и завершает программу теперь вопрос а как создать файл?

И еще вопрос что значат коды return 0 это помоему нормальное завершение программы а return -1 ? и какие они еще есть? ....
Создание файла аналогично, но как обычно - масса вариантов файлы/потоки C/C++
например поток в C++ на запись
std::ofstream F("имя_файла");
Как обычно, до записи надо проверить if(F).., т.к. система может не открыть поток

Возвращаемый код возврата, ничего сам по себе не означает. Можете возвращать что хотите.
Стандарта на это нет (вроде), но "принято" возвращать 0, когда всё хорошо, и другие значения (обычно unsign int), когда что-то плохо. Соответствие между значением этого кода и причиной его назначения - ваше дело. Подобные коды могут использоваться в оболочках для выбора последующих действий.

Например - можно написать "bat" файл для архивации и пересылки чего-то. Архиватор "иногда" может не выполнить полностью работу, тогда он возвращает не нулевой код, следовательно архив уже можно не пересылать.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
25.08.2009, 19:01 #38
Цитата Сообщение от Neo-n06 Посмотреть сообщение
И еще вопрос что значат коды return 0 это помоему нормальное завершение программы а return -1 ? и какие они еще есть? ....
Заголовочный файл sysexits.h изучите. Но в большинстве случаев по-моему и в правду этим не заморачиваются. 0 - всё хорошо, 1 - всё плохо
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
25.08.2009, 19:37 #39
Цитата Сообщение от easybudda Посмотреть сообщение
sysexits.h
А он стандартный? Чёт не могу найти в справочнике.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
25.08.2009, 20:37 #40
Цитата Сообщение от skvor Посмотреть сообщение
А он стандартный? Чёт не могу найти в справочнике.
А это смотря, что стандартом считать... В стандартном С в stdlib.h определены только две константы:
C
1
2
#define EXIT_FAILURE    1
#define EXIT_SUCCESS    0
Сам по себе файл sysexits.h сначала в BSD системах появился, а потом и в большинстве остальных *NIX прижился. В VS 8 тоже искал - не нашёл. Потому вот он из MacOS X весь, как есть:
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
/*
 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * [url]http://www.opensource.apple.com/apsl/[/url] and read it before using this
 * file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
/*
 * Copyright (c) 1987, 1993
 *  The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *  This product includes software developed by the University of
 *  California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *  @(#)sysexits.h  8.1 (Berkeley) 6/2/93
 */
 
#ifndef _SYSEXITS_H_
#define _SYSEXITS_H_
 
/*
 *  SYSEXITS.H -- Exit status codes for system programs.
 *
 *  This include file attempts to categorize possible error
 *  exit statuses for system programs, notably delivermail
 *  and the Berkeley network.
 *
 *  Error numbers begin at EX__BASE to reduce the possibility of
 *  clashing with other exit statuses that random programs may
 *  already return.  The meaning of the codes is approximately
 *  as follows:
 *
 *  EX_USAGE -- The command was used incorrectly, e.g., with
 *      the wrong number of arguments, a bad flag, a bad
 *      syntax in a parameter, or whatever.
 *  EX_DATAERR -- The input data was incorrect in some way.
 *      This should only be used for user's data & not
 *      system files.
 *  EX_NOINPUT -- An input file (not a system file) did not
 *      exist or was not readable.  This could also include
 *      errors like "No message" to a mailer (if it cared
 *      to catch it).
 *  EX_NOUSER -- The user specified did not exist.  This might
 *      be used for mail addresses or remote logins.
 *  EX_NOHOST -- The host specified did not exist.  This is used
 *      in mail addresses or network requests.
 *  EX_UNAVAILABLE -- A service is unavailable.  This can occur
 *      if a support program or file does not exist.  This
 *      can also be used as a catchall message when something
 *      you wanted to do doesn't work, but you don't know
 *      why.
 *  EX_SOFTWARE -- An internal software error has been detected.
 *      This should be limited to non-operating system related
 *      errors as possible.
 *  EX_OSERR -- An operating system error has been detected.
 *      This is intended to be used for such things as "cannot
 *      fork", "cannot create pipe", or the like.  It includes
 *      things like getuid returning a user that does not
 *      exist in the passwd file.
 *  EX_OSFILE -- Some system file (e.g., /etc/passwd, /etc/utmp,
 *      etc.) does not exist, cannot be opened, or has some
 *      sort of error (e.g., syntax error).
 *  EX_CANTCREAT -- A (user specified) output file cannot be
 *      created.
 *  EX_IOERR -- An error occurred while doing I/O on some file.
 *  EX_TEMPFAIL -- temporary failure, indicating something that
 *      is not really an error.  In sendmail, this means
 *      that a mailer (e.g.) could not create a connection,
 *      and the request should be reattempted later.
 *  EX_PROTOCOL -- the remote system returned something that
 *      was "not possible" during a protocol exchange.
 *  EX_NOPERM -- You did not have sufficient permission to
 *      perform the operation.  This is not intended for
 *      file system problems, which should use NOINPUT or
 *      CANTCREAT, but rather for higher level permissions.
 */
 
#define EX_OK       0   /* successful termination */
 
#define EX__BASE    64  /* base value for error messages */
 
#define EX_USAGE    64  /* command line usage error */
#define EX_DATAERR  65  /* data format error */
#define EX_NOINPUT  66  /* cannot open input */
#define EX_NOUSER   67  /* addressee unknown */
#define EX_NOHOST   68  /* host name unknown */
#define EX_UNAVAILABLE  69  /* service unavailable */
#define EX_SOFTWARE 70  /* internal software error */
#define EX_OSERR    71  /* system error (e.g., can't fork) */
#define EX_OSFILE   72  /* critical OS file missing */
#define EX_CANTCREAT    73  /* can't create (user) output file */
#define EX_IOERR    74  /* input/output error */
#define EX_TEMPFAIL 75  /* temp failure; user is invited to retry */
#define EX_PROTOCOL 76  /* remote error in protocol */
#define EX_NOPERM   77  /* permission denied */
#define EX_CONFIG   78  /* configuration error */
 
#define EX__MAX 78  /* maximum listed value */
 
#endif /* !_SYSEXITS_H_ */
Описание к функции exit() почитайте...
Neo-n06
22 / 3 / 1
Регистрация: 21.06.2009
Сообщений: 38
26.08.2009, 00:16  [ТС] #41
Посоветуйте справочник по C++ и если можно ссылку где скачать
Gravity
562 / 556 / 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
562 / 556 / 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() никогда не выполнится, потому что раньше произойдет выход из функции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2009, 21:07
Привет! Вот еще темы с ответами:

Задача про массивы и функции - 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...


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

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

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