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

Поиск:

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


Эксперт
***


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

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



BlHol, Да, если прямо пишешь ofstream файл создается, так как это аналогично fstream("...",ios::out) (как я уже говорил файл будет создан почти в любом случае, кроме недоступности исходного места, либо явного предписания nocreate или noreplace).
Указывать флаги можешь все, но тогда файл уже должен быть создан. Я так понимаю выходом в твоем случае будет хрень, типа:
Код

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;
    fbin.open(filename, ios::binary | ios::out);
    if (!fbin) {
        cout << "Could not open file " << filename;
        return -1;
    }
    fbin.close();
    fbin.clear();
    fbin.open(filename, ios::binary | ios::out | ios::in);
    /* И дальше по плану*/



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


Шустрый
*


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

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



ВО!!!! Вот теперь все точки над Ё расставлены...
Спасибище огромадное...
С уважением.
PM MAIL   Вверх
BlHol
Дата 10.4.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Однако, здравствуйте!
Нарисовался следующий трабл...
Если файлика нет и мы открываем его на запись (только флаг ios::out), то при следующем открытии файла все существующие записи затираются.
Посему вопрос:
Каким образом проверяется существование файла?
Т.е. в итоге задачка такова: если файла нет, то он создается и в него что-то пишется, если он есть, то открывается таким образом, чтоыб его содержимое не уничтожалось.
Заранее спасибо.
С уважением...
PM MAIL   Вверх
dizzy1984
Дата 10.4.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

ofstream out(sFileName, ios_base::out|ios_base::app);

PM MAIL   Вверх
BlHol
Дата 10.4.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



С чем сравнивается out  в данном случае?
PM MAIL   Вверх
JackYF
Дата 10.4.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(BlHol @  10.4.2007,  14:48 Найти цитируемый пост)
С чем сравнивается out


не понял вопроса...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
zkv
Дата 10.4.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(BlHol @  10.4.2007,  14:48 Найти цитируемый пост)
С чем сравнивается out  в данном случае? 

тут чтоли?
Цитата(dizzy1984 @  10.4.2007,  13:59 Найти цитируемый пост)
ofstream out(sFileName, ios_base::out|ios_base::app);


здесь ничего не сравнивается, только кроме устанавливаемого бита, определяемого ios::out также устанавливается бит ios::app (append,  "добавлять"), вместе они говорят о том, что файл будет открыт для дозаписи.
PM MAIL   Вверх
BlHol
Дата 10.4.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дописываться будет в конец?
Дело в том, что в данный файл пишется с произвольной выборкой. Т.е. сейчас у меня запись №3, а при следующем открытии файла №1. 
PM MAIL   Вверх
Xenon
Дата 10.4.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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


Шустрый
*


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

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



Там задачка такая. Открывается файл, вводится номер записи и по этому номеру пишутся данные. Считывание происходит также по номеру записи (они идут по порядку от начала к концу файла). Фишка в том, что я могу сначала записать больший номер (скажем, 10), а затем меньший (например, 2) и одно не затрет другое. Поэтому, если открывать файл только с ios::binary | ios::out, то при следующем открытии новая инфа затирает старую. А если с ios::binary | ios::out | ios::in, то файл должен уже существовать. Вот и требуется, чтобы если файла нет, то он должен создаваться и открываться с   ios::binary | ios::out, а если он уже есть, то с ios::binary | ios::out | ios::in, чтобы не затирать то, что было записано при предыдущем открытии.
PM MAIL   Вверх
Xenon
Дата 11.4.2007, 18:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Так вот так можно. Можно штатными функциями WinApi проверять есть ли файл. Но можно, по-моему, вполне так - в итоге один фиг.
Код

std::fstream file("d:\\superfile.dat", std::ios::out | std::ios::in | std::ios::binary);
if (!file)
{
    file.clear();
    file.open("d:\\superfile.dat", std::ios::out | std::ios::binary);
    if (!file)
    {
        std::cout << "File could not be created";
        return 0;
    }
}
file.seekp(0, std::ios::beg);
/*Делай что хочешь*/



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


Шустрый
*


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

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



Спасибо, но почему-то при использовании fbin.clear() не работает. Срабатывает только при закомментареном fbin.clear(). С чего бы это?
PM MAIL   Вверх
Xenon
Дата 12.4.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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


Шустрый
*


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

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



С вашего позволения, немного продолжу.
Попытался решить задачу через switch - case, т.е. предлагаю варианты (записи, чтения, выхода). В каждом из case реализую открытие файла сообразно выбранному варианту.
Почему-то выдает ошибку case bypasses initialization of local variable. Это к чему?
Заранее спасибо.
PM MAIL   Вверх
betal
Дата 17.4.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Xenon @  6.4.2007,  14:39 Найти цитируемый пост)
BlHol, Ну так у тебя он открывается на чтение, а не на запись в первом случае.
Так должно быть

 smile  
Цитата(vinter @  6.4.2007,  14:39 Найти цитируемый пост)
потомучто он открывается на вывод, вот он тебе и создается! а в первом случае ты открываешь на ввод, а зачем создавать файл когда ты хочешь что-то читать? что ты будешь читать из вновь созданного файла?? 

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

блин по этому поводу и добавить т нечго. Приходится молча кивать головой smile 
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0903 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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