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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с бинарными файлами, Ввод / Вывод. Создание файла. 
V
    Опции темы
ioManip
Дата 6.10.2013, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Привет! smile  Хочу создать бинарный файл. Записать в него случ. числа и вывести их!
Но не выходит:
Код

void CreateFile()
{
    fstream binFile("file", fstream::in | fstream::out | fstream::binary);
    
    int n; // количество чисел в файле
    int rand_number;
    
    srand(time(NULL));
    
    cout << "Сколько чисел записать в файл?" << endl;
    cout << "-> ";
    cin >> n; 
   
    while (!binFile.eof())
    {
        for (int i = 0; i < n; i++)
        {
            rand_number = rand() % 10;
            binFile.write((const char*) &rand_number, sizeof(int));  
        }
    }
    
    while(!binFile.eof())
    {
        binFile.read((char*) &rand_number, sizeof(int));
    }
}

И еще, после создания, бинарный файл должен появиться в директории?(а то у меня нету)

Это сообщение отредактировал(а) ioManip - 6.10.2013, 05:47
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
Чупакабро
Дата 6.10.2013, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ioManip @  6.10.2013,  05:45 Найти цитируемый пост)
 
fstream binFile("file", fstream::in | fstream::out | fstream::binary);

Забыл в этой строке флаг fstream::trunc - создает новый файл


Цитата(ioManip @  6.10.2013,  05:45 Найти цитируемый пост)
   
while (!binFile.eof())   {        
  for (int i = 0; i < n; i++)        {            
    rand_number = rand() % 10;            
  binFile.write((const char*) &rand_number, sizeof(int));          
  }    
}

while не нужен! Так как файл еще пустой, так ты никогда не зайдешь в цикл.
Перепиши так:
Код

for (int i = 0; i < n; i++)
        {
            rand_number = rand() % 10;
            binFile.write((const char*) &rand_number, sizeof(int));  
        }


Ну и да, перед чтением из файла установи указатель чтения на начало:
Код

binFile.seekg(0, fstream::beg);
while(!binFile.eof())
    {
        binFile.read((char*) &rand_number, sizeof(int));
    }


PS А еще неплохо бы в конце закрыть файл:
Код

binFile.close();


Это сообщение отредактировал(а) Чупакабро - 6.10.2013, 09:19
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
ioManip
Дата 8.10.2013, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Переписал вот так:
Код

void CreateFile()
{
    fstream binFile("file", fstream::in | fstream::out | fstream::trunc| fstream::binary);
    
    int n; // количество чисел в файле
    int rand_number;
    
    srand(time(NULL));
    
    cout << "Сколько чисел записать в файл?" << endl;
    cout << "-> ";
    cin >> n; 
   
    for (int i = 1; i < n; i++)
    {
       rand_number = rand() % 10;
       binFile.write((const char*) &rand_number, sizeof(int));  
    }
     
    binFile.seekg(0, fstream::beg);
    while(!binFile.eof())
    {
        binFile.read((char*) &rand_number, sizeof(int));
        cout << rand_number << " ";
    }
    
    binFile.close();
}


Но при попытке вывести содержимое файла, 2 последние числа всегда оказываются одинаковыми. Почему?

Это сообщение отредактировал(а) ioManip - 8.10.2013, 03:23
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
xvr
Дата 8.10.2013, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(ioManip @  8.10.2013,  02:57 Найти цитируемый пост)
Но при попытке вывести содержимое файла, 2 последние числа всегда оказываются одинаковыми. Почему?

Потому что eof() выставляется после неудачной попытки считать данные (за границей файла). При этом read() в ваш rand_number ничего не записывает

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


Бывалый
*


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

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



xvr, эмм..то есть это нормально?
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
xvr
Дата 8.10.2013, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(ioManip @  8.10.2013,  14:42 Найти цитируемый пост)
то есть это нормально? 

Да

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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