Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2012, 15:06   #1
Niaden
Новичок
Джуниор
 
Регистрация: 29.10.2012
Сообщений: 4
По умолчанию кодировка при записи/считывании в файл/из файла функциям fread и fwrite

Добрый день. Нижеприведенные проги (прога №1 с fread,fwrite и прога №2 с fscanf,fprintf) записывают в файл 5 целых чисел. Из этого же файла считывают эти числа и выводит их на stdout. Обе проги работают нормально. Только вот, почему, когда после записи в файл in.txt посредством fwrite в проге №1, я открываю файл и вижу там "{ кяяя- цяяя7 " вместо "123 -22 301 -10 55", в то время как прога №2 записывает в файл out.txt "123 -22 301 -10 55" вместо всякой белиберды?

тоже самое происходит, если я попытаюсь ручками напечатать в блокноте 5 целых чисел через пробел, сохраню его, а потом попытаюсь прочитать это с помощью fread, где *ptr будет указывать на массив из 5и элементов типа инт, в то время как fscanf-ом это отлично читается. Тип char fread читает с блокнота без проблем. По-скольку не могу нормально считывать целые числа из текстовых редакторов с помощью fread, то не могу и структуры с целыми числами считывать. застопорился, вообщем :'(
Подскажите, в чем дело? покопался в интернете, ответа не нашел( в примерах это не описывается.

и если можно, объясните разницу между "wt" и "wb". Знаю, что t - текстовый, а b - двоичный.
прочитал, что :
"Файл можно открывать либо в текстовом, либо в двоичном режиме. В текстовом режиме выполняются преобразования некоторых символов. Например, символы новой строки преобразуются в комбинацию кодов возврата каретки (ASCII 13) и конца строки (ASCII 10). В двоичном режиме подобные преобразования не выполняются."
Разве разница только в обработке символов перехода на новую строку? не могу уловить суть
если можно, какие-то примеры приведите. буду благодарен...



*********************************** ****************
ПРОГА с FREAD,WRITE
*********************************** ***************
Код:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
   FILE *fp;
   int array_to_output[5] = { 123, -22, 301, -10, 55};
   int array_to_input[5];
   int i;
 
   /*  запись   значений   */
   if ( ( fp = fopen("c:\\in.txt", "wb") ) == NULL)             //c "wt" тоже пробовал
   {
      printf("He удается открыть файл. \n");
      exit(1);
   }
   if ( fwrite(array_to_output, sizeof(int) , 5, fp) != 5)
      printf( "Ошибка при записи файла." );
   fclose(fp);
   
   /* чтение значений */
   if ((fp = fopen("c:\\in.txt", "rb")) == NULL) 
   {
      printf( "He удается открыть файл.\n" ) ;
      exit(1);
   }
   if (fread(array_to_input, sizeof(int), 5, fp) != 5)
   {
      if ( feof( fp ) )
         printf("Преждевременное достижение конца файла.");
      else
         printf("Ошибка при чтении файла.");
   }
   fclose(fp);
 
   for( i=0; i<5; i++)
      printf( "%d ", array_to_input[i]);
      
return 0;
}
*********************************** ****************
ПРОГА со FSCANF, FPRINTF
*********************************** ***************
Код:
#include <iostream>
 
using namespace std;
 
int main()
{
    FILE *in, *out;
    int array_to_input[5];
    int array_to_output[5] = { 123, -22, 301, -10, 55};
    int i;
 
    if ( ( out = fopen("c:\\out.txt","wb")) == NULL)
        {
            fprintf( stderr, "nevozmojno otkrit' fail dlya zapisi" );
            exit(1);
        }
    for (i=0; i<5; i++)
        fprintf( out, "%d ",array_to_output[i] );
    fclose(out);
 
    if ( ( in = fopen("c:\\out.txt","rb")) == NULL)           
        {
            fprintf(stderr,"nevozmojno otkrit' fail dlya 4teniya");
            exit(1);
        }
    for ( i=0; i<5; i++)
        {
            fscanf( in, "%d",&array_to_input[i] );
            cout << "array_to_input[i] = " << array_to_input[i] << "  ";
            if ( (i + 1 ) % 2 == 0) 
                cout << '\n';
        }
    cout << '\n';
    fclose(in);
    return 0;
}
Добавлено через 17 минут
среда - Visual Studio 2010 C++
Niaden вне форума Ответить с цитированием
Старый 29.10.2012, 15:29   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
покопался в интернете, ответа не нашел
Плохо копался.
FWrite предназначено для записи в бинарном виде.
У тебя описан массив типа int, это значит что каждый элемент представляется набором из 4-х байт, описывающих в машинном представлении указанное тобой число (числа). Вот так в таком машинном виде, как это число и записано в памяти эта функция толкает его в файл, а просмотрщик просто пытается эти 4 байта интерпретировать как символы. FPRINTF же перед записью в файл переводит в читабельную для человека форму - в текст. Таким образом в файл попадает текстовое представление числа в машинном коде. Потому файл от второй программы читается в блокноте по человечески.

Читай учебники внимательнее
Цитата:
Разве разница только в обработке символов перехода на новую строку?
Не совсем, там есть еще и другие ограничения. Подробности в МСДН.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.10.2012, 15:58   #3
Niaden
Новичок
Джуниор
 
Регистрация: 29.10.2012
Сообщений: 4
По умолчанию

я только учусь)
спасибо.
скачал редактор двоичных файлов. открыл им "in.txt".
Теперь у мну есть прямое соответствие между тем, делает программа и тем, что вижу. Т.с. сработал переключатель в голове)

спасибо)

хм. как закрыть тему?

Последний раз редактировалось Stilet; 29.10.2012 в 16:19.
Niaden вне форума Ответить с цитированием
Старый 29.10.2012, 16:18   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Никак. Закрывать ее не надо, в ней нет нарушений.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
доступ по неверному указателю при построчном считывании данных из файла okrill Общие вопросы C/C++ 3 01.09.2012 19:07
Дублирует структуру при считывании из файла RaTeN Общие вопросы C/C++ 2 05.10.2011 00:28
Кодировка при чтении из файла _-Re@l-_ Общие вопросы .NET 2 21.11.2010 20:12
Проблема при считывании из файла JeyKip Общие вопросы C/C++ 0 17.01.2010 22:03
Помогите разобраться, ошибка при считывании из ini файла XATAB Помощь студентам 4 13.02.2007 05:57