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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бинарный ввод/вывод, Нужно разъяснение... 
V
    Опции темы
zhenium
Дата 21.10.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый вечер всем.
Вот у меня такой вопрос: если с помощью функции fwrite() записать в тхт-файл массив с несколькими числами, то в итоге получим в файле набор символов, а не цифр? Или я что-то делаю не так?
Разъясните, кому не влом, думаю это простой ворпос...
PM MAIL   Вверх
Xenon
Дата 21.10.2006, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А какого типа массив?


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


механик-вредитель
***


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

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



zhenium, 
fwrite() записывает последовательность байтов. Если у тебя массив типа int, то в файл будет записываться двоичное представление этих чисел.Например, число 255 для int 2-байтового:
представление - 00 FF в 16-ричном коде. В память запишется как FF 00 (даже в перевернутом виде).
Для записи именно цифрового представления числа его придется преобразовать к строку или использовать функцию fprintf() с соответствующими параметрами 

Это сообщение отредактировал(а) Kuvaldis - 21.10.2006, 23:32


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
zhenium
Дата 21.10.2006, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня массив типа int.

>>> Kuvaldis:
Цитата

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

Подскажи, как это выполнить. С fprintf() всё вроде понятно...
PM MAIL   Вверх
Kuvaldis
Дата 21.10.2006, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



zhenium, 
Есть функциz itoa()
если пишешь в Builder, то IntToStr()


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Daevaorn
Дата 21.10.2006, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



zhenium, 
Код

#include <cstdio>

int main()
{
    FILE* outp = fopen( "out.txt", "w" );
    
    int data[] = { 5, 7, 34, 56, 45 };
    int count = sizeof( data ) / sizeof( int);

    for( int i = 0; i < count; ++i )
        fprintf( outp, "%d\n", data[ i ] );

    fclose( outp );

    return 0;
}

PM MAIL WWW   Вверх
zhenium
Дата 22.10.2006, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Есть функциz itoa()
если пишешь в Builder, то IntToStr() 


Я пишу в Borland C++ 3.1 и в Dev-C++. Какие параметры нужно передавать в эту функцию?
PM MAIL   Вверх
Kuvaldis
Дата 22.10.2006, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



zhenium, 
а F1 нажать ты не пробовал?
Из справки Builder
Код

Header File

stdlib.h 

Category

Conversion Routines, Math Routines

Prototype

char *itoa(int value, char *string, int radix);

wchar_t *_itow(int value, wchar_t *string, int radix);

Description

Converts an integer to a string.

itoa converts value to a null-terminated string and stores the result in string. With itoa, value is an integer. _itow is the unicode version of the function. It converts an integer to a wide-character string.

radix specifies the base to be used in converting value; it must be between 2 and 36, inclusive. If value is negative and radix is 10, the first character of string is the minus sign (-).

Note:    The space allocated for string must be large enough to hold the returned string, including the terminating null character (\0). itoa can return up to 33 bytes.

Return Value

itoa returns a pointer to string.


Это сообщение отредактировал(а) Kuvaldis - 22.10.2006, 00:15


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
zhenium
Дата 22.10.2006, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В общем, чтобы сильно вас не пытать, приведу текст программы на Си. Её суть такая: генерируются числа, записываются в тхт-файл, затем оттуда считываются и выводятся на экран. Для записи нужно использовать функцию fwrite() ( по условию ). В массив нужно присвоить данные, считанные из файла. Что не делаю, а на экран выводятся нули. Помогите исправить.
P.S. Код написан в Dev-C++...
Заранее благодарен!

Код

#include <stdlib.h>
#include <stdio.h>

#define ELEM 20

int main( void )
{
        FILE *fp;
        int ctr;
        int mass[ELEM];
        
        srand( time( NULL ) );
        
        if( ( fp = fopen( "binary.txt", "wb" ) ) == NULL )
        {
                fprintf(stderr, "Oshibka otkritia faila binary.txt.");
                exit( 1 );
        }
        
        fprintf(fp, "Ishodnie dannie:");
        
        for( ctr = 0; ctr < ELEM; ctr++ )
            mass[ctr] = rand() % ( 130 - 30 + 1 ) + 30;
       
        if( fwrite( mass, sizeof( int ), ELEM, fp ) != ELEM ) 
        {
            fprintf(stderr, "\nOshibka zapisi v fail.");
            system("Pause");
            exit( 1 );
        }
        
        if( fread( mass, sizeof( int ), ELEM, fp ) != ELEM ) 
        {
            fprintf(stderr, "\nOshibka schitivania.");
            system("Pause");
            exit( 1 );
        }
        
        for( ctr = 0; ctr < ELEM; ctr++ )
            printf("mass[%2d] = %d\n", ctr + 1, mass[ctr]);
        
        fclose( fp );
        
        system("Pause");
       
        return 0;
}


Это сообщение отредактировал(а) zhenium - 22.10.2006, 00:18
PM MAIL   Вверх
Kuvaldis
Дата 22.10.2006, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



zhenium, 
Замечания:
1. ты открываешь файл для записи "wb", но пытаешься читать из него. Нехорошо. По правилам хорошего тона программирования надо сначала открыть файл для записи, записать, закрыть файл. Потом открыть файл для чтения, прочитать, закрыть файл. 

2. При работе с файлами надо, желательно использовать или функции типа fprintf() или fread(). Ты записываешь в выходной файл через fprintf()символьную строку, которая является массивов байт. При чтении fread() данная строка рассматривается как представление 2-х байтового int. т.е. вместо например, "12" компитятор рассматривает число, образованное 2 байтами, в которых записаны коды символов 1 и 2.
(этот момент я в исправленном коде выбросил)
исправленный код
Код

//-----------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
//-----------------------------------------------------------------------------
#define ELEM 10
//-----------------------------------------------------------------------------
int main( void )    
{    
        FILE *fp;    
        int ctr;    
        int mass[ ELEM ];    
         
        srand( time( NULL ) );    
         
        
        if( ( fp = fopen( "binary.txt", "wb" ) ) == NULL )
        {    
                fprintf(stderr, "Oshibka otkritia faila binary.txt.");
                system("Pause");    
                exit( 1 );    
        }    
         
        // fprintf(fp, "Ishodnie dannie:");    
         
        for( ctr = 0; ctr < ELEM; ctr++ )
        {
            mass[ctr] = rand() % ( 130 - 30 + 1 ) + 30;
            printf("%4d", mass[ctr]);
        }
        
        if( fwrite( mass, sizeof( int ), ELEM, fp ) != ELEM )    
        {    
            fprintf(stderr, "\nOshibka zapisi v fail.");    
            system("Pause");    
            exit( 1 );    
        }    

        fclose( fp );
        puts("");

        if( ( fp = fopen( "binary.txt", "rb" ) ) == NULL )
        {
                fprintf(stderr, "Oshibka otkritia faila binary.txt.");
                system("Pause");
                exit( 1 );
        }
         
        if( fread( mass, sizeof( int ), ELEM, fp ) != ELEM )    
        {    
            fprintf(stderr, "\nOshibka schitivania.");    
            system("Pause");    
            exit( 1 );    
        }
         
        for( ctr = 0; ctr < ELEM; ctr++ )    
            printf("mass[%2d] = %d\n", ctr + 1, mass[ctr]);    
         
        fclose( fp );    
         
        system("Pause");    
        
        return 0;    
}


Это сообщение отредактировал(а) Kuvaldis - 22.10.2006, 00:39


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
zhenium
Дата 22.10.2006, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



>>> Kuvaldis 

Низкий поклон за помощь!!!
Сам бы кучу времени потратил бы на поиск ошибок...

PM MAIL   Вверх
Kuvaldis
Дата 22.10.2006, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



zhenium, 
Цитата

Сам бы кучу времени потратил бы на поиск ошибок...

Чтобы научиться программировать, нужно программировать (@ Brian Kernigan) smile 
Старайся, если что обращайся

Это сообщение отредактировал(а) Kuvaldis - 22.10.2006, 10:27


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
zhenium
Дата 22.10.2006, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо тебе за совет.
Кстати, последние недели этим по большей части и занимаюсь. В универе у нас на лекциях только общие моменты дают, а требуют серьёзно. Предмет этот у нас профильный. Поэтому самообразованием занимаюсь: по книге, да на этом форуме иногда появляюсь, всё же легче, чем за преподом бегать с каждым вопросом. Да и самому интересно очень...

Сегодня вот почти весь день разбирался с принципами работы с файлами. Ну вроде более-менее разобрался. Всё вроде гладко шло, пока до бинарного ввода/вывода не дошёл. Но ты помог на этом поставить точку. За это ещё раз Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0940 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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