Кодировка При Записи/считывании В Файл/из Файла Функциям Fread И Fwrit

Niaden

New member
29.10.2012
1
0
#1
Добрый день. Нижеприведенные проги (прога №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
*********************************** ***************

C++:
#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
*********************************** ***************
C++:
#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;
}
среда - Visual Studio 2010 C++
 

Niaden

New member
29.10.2012
1
0
#2
разобрался.
скачал редактор двоичных файлов, открыл им in.txt. все стало на свои места.