Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция открытия файла 
:(
    Опции темы
mr.Anderson
Дата 7.8.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Я написал собственную функцию открытия файла взамен стандартной fopen. Вот ее код:
Код

#include <iostream.h>
#include <string>
using namespace std;
bool open_file(string file_name,string type)
{
 FILE *f;
 string print;
 switch(type.c_str())
 {
  if(type=="r") print=" to read!";
  if(type=="w") print=" to create and write!";
  if(type=="w+") print=" to ...";
  if(type=="r+") print=" to ...";
  if(type=="a+") print=" to ...";
  if(type=="a") print=" to until write!";
 }
 if((f=fopen(file_name.c_str(),type.c_str()))==NULL)
 {
  cout<<"\nError: Can't open file "<<print;
  return false;
 }
}

Но выдается ошибка, что в скобках switch должно быть значение типа "integral" (это int, что ли?). И еще ругается на fopen на второй параметр (опять лопочет о каком-то преобразовании типов).
Прошу исправить ошибки!


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
cardinal
Дата 7.8.2005, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



switch не работает со строками


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
mr.Anderson
Дата 7.8.2005, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



smile Тогда, может, так правильно?
Код

#include <iostream.h>
#include <string>
using namespace std;
bool open_file(string file_name,string type)
{
 FILE *f;
 string print;
 if(type=="r") print=" to read!";
 if(type=="w") print=" to create and write!";
 if(type=="w+") print=" to ...";
 if(type=="r+") print=" to ...";
 if(type=="a+") print=" to ...";
 if(type=="a") print=" to until write!";

 if((f=fopen(file_name.c_str(),type.c_str()))==NULL)
 {
  cout<<"\nError: Can't open file "<<print;
  return false;
 }
}



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
sergejzr
Дата 7.8.2005, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Так то правильно, только смысла в этой функции? Во первых она никогда не возвратит true, а во вторых ты потеряешь указатель на FILE, так как это локальная переменная.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
mr.Anderson
Дата 7.8.2005, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Блин, опять не дописал...
Код

#include <iostream.h>
#include <string>
using namespace std;
bool open_file(string file_name,string type)
{
 FILE *f;
 string print;
 if(type=="r") print=" to read!";
 if(type=="w") print=" to create and write!";
 if(type=="w+") print=" to ...";
 if(type=="r+") print=" to ...";
 if(type=="a+") print=" to ...";
 if(type=="a") print=" to until write!";

 if((f=fopen(file_name.c_str(),type.c_str()))==NULL)
 {
  cout<<"\nError: Can't open file "<<print;
  return false;
 }
 else return true;
}

Теперь true возвратит. smile
Про локалку действительно проблема... Ее можно сделать глобальной (для этого, вроде, extern используется, да?).
Тогда вот так будет, да?
Код

#include <iostream.h>
#include <string>
using namespace std;
bool open_file(string file_name,string type)
{
 extern FILE *f;
 string print;
 if(type=="r") print=" to read!";
 if(type=="w") print=" to create and write!";
 if(type=="w+") print=" to ...";
 if(type=="r+") print=" to ...";
 if(type=="a+") print=" to ...";
 if(type=="a") print=" to until write!";

 if((f=fopen(file_name.c_str(),type.c_str()))==NULL)
 {
  cout<<"\nError: Can't open file "<<print;
  return false;
 }
 else return true;
}



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
sergejzr
Дата 7.8.2005, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(sim7 @ 7.8.2005, 13:57)
Ее можно сделать глобальной (для этого, вроде, extern используется, да?).
Тогда вот так будет, да?

static, не extern используется smile

Я бы на твоём месте делал так:

Код

#include <iostream.h>
#include <string>
using namespace std;
FILE * open_file(string file_name,string type)
{
 FILE *f;
 string print;
 if(type=="r") print=" to read!";
 if(type=="w") print=" to create and write!";
 if(type=="w+") print=" to ...";
 if(type=="r+") print=" to ...";
 if(type=="a+") print=" to ...";
 if(type=="a") print=" to until write!";
 if((f=fopen(file_name.c_str(),type.c_str()))==NULL)
 {
  cout<<"\nError: Can't open file "<<print;
  return NULL;
 }
 else return f;
}

И проверять потом:
Код

if(open_file(string file_name,string type)!=NULL)
{
 //всё ок
}else
{
//ошибка 
} 

Ещё вариант:
Код

#include <iostream.h>
#include <string>
using namespace std;
bool open_file(FILE &*f, string file_name,string type)
{
 string print;
 if(type=="r") print=" to read!";
 if(type=="w") print=" to create and write!";
 if(type=="w+") print=" to ...";
 if(type=="r+") print=" to ...";
 if(type=="a+") print=" to ...";
 if(type=="a") print=" to until write!";
 if((*f=fopen(file_name.c_str(),type.c_str()))==NULL)
 {
  cout<<"\nError: Can't open file "<<print;
  return false;
 }
 else return true;
}

И вызывать:
Код

FILE *f;
if(open_file(f, "мой_файл","r"))
{
 //всё ок
}else
{
//ошибка 
} 

Конечно не в стмле, но всё лучше, чем static..

Это сообщение отредактировал(а) sergej.z - 7.8.2005, 15:27


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
mr.Anderson
Дата 7.8.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Я, наверно, воспользуюсь вторым вашим вариантом, но мне непонятна вот эта строчка:
Код

bool open_file(FILE &*f, string file_name,string type)

Как это и амперсанд, и указатель на одну и ту же переменную, да и зачем это?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
sergejzr
Дата 7.8.2005, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Первый вариант - самый правильный.
Цитата(sim7 @ 7.8.2005, 14:13)
Как это и амперсанд, и указатель на одну и ту же переменную, да и зачем это?

Таким образом передаётся адрес указателя. Вызываем функцию с указателем, а в ней на самом деле попадает его адрес. Иначе значение указателя будет изменено только локально.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
mr.Anderson
Дата 7.8.2005, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Ну, в принципе, можно и первый вариант... smile А чем ваш второй хуже первого?
Мне больше нравится второй, так как там тип bool у функции сохранен. А мне что-то очень уж им захотелось попользоваться... smile smile
Добавлено @ 15:24
Да, и еще мне непонятен ваш первый вариант. Интересное условие: если файл не открыт, то возвращается указатель на файл, а если открыт, то NULL. smile Оригинально. smile
Это вот тут:
Код

if((f=fopen(file_name.c_str(),type.c_str()))==NULL)
 {
  cout<<"\nError: Can't open file "<<print;
  return f;
 }
 else return NULL;

Я так полагаю, должно быть вот эдак:
Код

if((f=fopen(file_name.c_str(),type.c_str()))==NULL)
 {
  cout<<"\nError: Can't open file "<<print;
  return NULL;
 }
 else return f;



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
sergejzr
Дата 7.8.2005, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(sim7 @ 7.8.2005, 14:21)
Я так полагаю, должно быть вот эдак:

Да, конечно. Это я смудрил smile

А второй вариант нехорош тем, что изменяет передаваемый аргумент, а это ооочень плохой стиль программирования.




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
mr.Anderson
Дата 7.8.2005, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Но ведь при работе с файлом так и так надо его менять. Хоть через функцию, хоть как. Для того его и открываем, верно ли?
Ну, вот, теперь не знаю, что выбрать. smile


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
sergejzr
Дата 7.8.2005, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



файл то да, но представь себе, ты вызываешь функцию, передаёшь в неё свои переменные, а после отработки функции у этих переменных меняются значения smile
При хорошем стиле передаваемые аргументы не меняются в функции. Передаёшь в неё значения - на выходе получаешь новое значение. Сами значения при этом не меняются.
Добавлено @ 15:31
Зря я конечно второй вариант написал smile))


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
mr.Anderson
Дата 7.8.2005, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Ладно, тогда возьму первый вариант. Спасибо! smile
Добавлено @ 15:33
Да уж, действительно зря. Такой он красивый... Теперь он у меня постоянно в голове будет сидеть. smile


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 7.8.2005, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



sergej.z, проблема. Ну, открыл я этой функцией (первый вариант smile ) файл. А как дальше с ним работать? Как извлечь указатель на файл? Вот практический пример: надо, открыв файл этой функцией, вывести его содержимое через цикл while. И как это сделать?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
cardinal
Дата 7.8.2005, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Почитай например тут:
http://ibs.howstuffworks.com/ibs/des/c18.htm
Добавлено @ 21:24
А также тут
Побайтное считывание файла
Обработка файла (как пример .bmp)

А еще поиском попользуйся... smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.