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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не открывается файл, Дескриптор все время равен 0 
:(
    Опции темы
BlHol
Дата 6.4.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



День добрый!
Коротенькая программка:

Код

#include <iostream>
#include <fstream>
using namespace std;

int get_int(int default_value);
char name[20];

int main() {
    char filename[81];
    int n;
    int age;
    int recsize = sizeof(name) + sizeof(int);
    

    cout << "Enter file name: ";
    cin.getline(filename, 80);

    // Open file for binary read and write.    

    fstream  fbin(filename, ios::binary | ios::in);
    if (!fbin) {
        cout << "Could not open file " << filename;
        return -1;
    }

//  Get record number to write to.

    cout << "Enter file record number: ";
    n = get_int(0);

    // Get data from end user.

    cout << "Enter name: ";
    cin.getline(name, 19);
    cout << "Enter age: ";
    age = get_int(0);

    // Write data to the file.
 
    fbin.seekp(n * recsize);
    fbin.write(name, 20);
    fbin.write(reinterpret_cast<char*>(&age), sizeof(int));
    fbin.close();
    return 0;
}

// Get integer function
// Get an integer from keyboard; return default
//  value if user enters 0-length string.
//
int get_int(int default_value) {
    char s[81];

    cin.getline(s, 80);
    if (strlen(s) == 0)
         return default_value;
    return atoi(s);
}



Так вот, binary файл не открывается, если его заранее не создать. Почему? 
Вопрос возник потому, что в случае с открытием текстового файла:

Код

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    char filename[81];

    cout << "Enter a file name and press ENTER: ";
    cin.getline(filename, 80);
    ofstream file_out(filename);
    if (! file_out) {
        cout << "File " << filename << " could not be opened.";
        return -1;
    }
    cout << "File " << filename << " was opened.";
    file_out << "I am Blaxxon," << endl;
    file_out << "the cosmic computer." << endl;
    file_out << "Fear me.";
    file_out.close();
    return 0;
}


проблем не возникает, даже если такого файла не существует.

Помогите, пожалуйста.
Заранее спасибо.
С уважением.
PM MAIL   Вверх
Xenon
Дата 6.4.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



BlHol, Ну так у тебя он открывается на чтение, а не на запись в первом случае.
Так должно быть
Код

fstream  fbin(filename, ios::binary | ios::out);



--------------------
user posted image  
PM MAIL   Вверх
vinter
Дата 6.4.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(BlHol @  6.4.2007,  14:17 Найти цитируемый пост)
проблем не возникает, даже если такого файла не существует.

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


--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 6.4.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 53
Всего: 183



Цитата(BlHol @  6.4.2007,  15:17 Найти цитируемый пост)
 fstream  fbin(filename, ios::binary | ios::in);

Ты пытаешься открыть файл на чтение (in), с чего бы ему создаваться?
А текстовый файл ты создаешь как выходной: ofstream.
Если тебе нужно только выводить информацию, оставь ofstream:
Код

ofstream  fbin(filename, ios::binary);



--------------------
...
PM   Вверх
BlHol
Дата 6.4.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Граждане, дико извиняюсь. При копировании кода потерял один кусочек. Строка выглядела так:

Код

fstream  fbin(filename, ios::binary | ios::in | ios::out);


Т.е. файл создается и на вход и на выход. (В книжке написано "с произвольной выборкой") А fbin, все равно, 0.




Еще раз прошу прощения.
Но что делать-то?
Заранее спасибо.
PM MAIL   Вверх
Xenon
Дата 6.4.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



По-моему обойти ограничение можно будет либо очистив флаги  сразу же после создания файла - fbin.clear(), либо открыв файл так:
Код

fstream  fbin(filename, ios::binary | ios::out | ios::app | ios::in);

Но тогда любая белеберда будет открываться ...

Это сообщение отредактировал(а) Xenon - 6.4.2007, 15:49


--------------------
user posted image  
PM MAIL   Вверх
BlHol
Дата 6.4.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И еще, что интересно, когда закомментарил /*ios::in*/, все заработало нормально. Почему?
PM MAIL   Вверх
Xenon
Дата 6.4.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



BlHol, Похоже что такая конструкция рассчитана на уже созданый файл (я имею ввиду ввод/вывод). При открытии файла на вывод он всегда создается, исключая ситуации когда это совершенно невозможно, либо установлены nocreate, или noreplace

Это сообщение отредактировал(а) Xenon - 6.4.2007, 15:58


--------------------
user posted image  
PM MAIL   Вверх
BlHol
Дата 6.4.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо.
Жду еще советов. 

Заранее спасибо.
PM MAIL   Вверх
apook
Дата 6.4.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 23



если Buildere то есть
Код

ios::trunc // усечь до нулевой длинны
ios::app   //добавить в конец файла

а если Turbo C++
Код

ios::nocreate // не создавать файл



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Xenon
Дата 6.4.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



apook
А как nocreate поможет избавиться от проблемы?


--------------------
user posted image  
PM MAIL   Вверх
apook
Дата 6.4.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 23



Цитата

Спасибо.
Жду еще советов. 

Я подумал что проблема решена и товарищ BlHol хочет
еще любой инфформации по этой теме  smile 


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
BlHol
Дата 6.4.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Естественно, хочет smile 
Проблема почти решена. Просто, пример из книжки не работает как нужно. Пришлось выкинуть ios::in, тогда файл создается. Если не выкидывать, то тогда нужно, чтобы файл уже был.
Просто, в книжке пишут, что конструкция fstream  fbin(filename, ios::binary | ios::in | ios::out);
пригодна и для записи и для чтения в (из) двоичный файл. Вот я и хочу понять, то ли в книге опечатка, то ли я где-то ошибаюсь.
PM MAIL   Вверх
Xenon
Дата 6.4.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



BlHol, Все правильно, просто файл уже должен быть создан. При чем следует не забывать, что после записи перед чтением (и наоборот) необходимо сбрасывать биты состояния - fbin.clear();
PS. Книжка не Лафоре случайно?

Это сообщение отредактировал(а) Xenon - 6.4.2007, 17:34


--------------------
user posted image  
PM MAIL   Вверх
BlHol
Дата 7.4.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Xenon @ 6.4.2007,  17:33)
Все правильно, просто файл уже должен быть создан. При чем следует не забывать, что после записи перед чтением (и наоборот) необходимо сбрасывать биты состояния - fbin.clear();
PS. Книжка не Лафоре случайно?

1. Вот меня и интересует. Почему, в случае с тектовым файлом он создается, а, в случае с binary нет. В том ли причина, что при записи в текстовый файл, я прямо указываю ofstream?
И что, значит в книге опечатка и нужно в 
Код

fstream fbin() 
указывать не все флаги, а только те, которые   нужны в данный момент, т.е. при записи в файл 
Код

ios::out
, а при чтении
Код

 ios::in
?
2. Книжка Оверленда, называется "С++ без страха".

С уважением.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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