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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2009, 10:17   #1
ongleb
Пользователь
 
Регистрация: 30.07.2009
Сообщений: 10
По умолчанию ошибка при чтении файла

Господа,
простите за дурацкий вопрос (5лет на С-диалекты не использовал)
пытаюсь читать файл
читается но помоему с ошибкой

------------------файл при просмотре в hex-mode--------------------
09 8d 09 78 09 63 09 4d ...
--------------------------

-------------------мой код (коротко без проверок)------------------
Код:
int err,val;
FILE *SourseFile;
char *bufer;

bufer=(char*)malloc(<filesize>*sizeof(int));
SourseFile=fopen(<filename>,"r");
err=fread(bufer,1,<filesize>,SourseFile);
val= bufer[0]*256+bufer[1] ;
-----------------------------------------------------------------------

в результате выполнения bufer[0] и bufer[1] принимают значения
bufer[0] = 9 (0х09)
bufer[1] = -115 (0xFFFFFF8D) // должно быть 141 (0x8D)

может нельзя к такому буферу обращаться как к массиву?
или я читаю этот файл как то не так?

Последний раз редактировалось Sazary; 30.07.2009 в 13:38.
ongleb вне форума Ответить с цитированием
Старый 30.07.2009, 11:35   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Вот проверил
Код:
//---------------------------------------------------------------------------

#pragma hdrstop

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

//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
int err,val;
FILE *SourseFile;
char *bufer;

bufer=(char*)malloc(20);
SourseFile=fopen("C:\\temp\\bo_dump.txt ","r");
err=fread(bufer,1,20,SourseFile);
cout<<bufer;
getchar();
	return 0;
}
//---------------------------------------------------------------------------
Никаких ошибок за исключением того что я не знаю как получить размер файла.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2009, 12:21   #3
ongleb
Пользователь
 
Регистрация: 30.07.2009
Сообщений: 10
Вопрос

может нельзя использовать bufer[1] как int-овое значение?
почему то
в строке val=bufer[0]*256+bufer[1] ;
получается неверный результат
пробовал val=(bufer[0]<<8)+bufer[1] ;
всеравно bufer[0] в расчете участвует как 9-ка а bufer[1] как -115 ничего не понимаю

конструкция типа (int)bufer[1] не помогает
ongleb вне форума Ответить с цитированием
Старый 30.07.2009, 12:28   #4
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Файл бинарный или текстовый ? Если бинарный, то следует открывать как
Код:
SourseFile=fopen(<filename>,"rb");
Неверное чтение вполне может быть связно с типом данных буфера, попробуйте его объявить не как char*, а как short* или int*, поэкспериментируйте.
oleg kutkov вне форума Ответить с цитированием
Старый 30.07.2009, 12:44   #5
ongleb
Пользователь
 
Регистрация: 30.07.2009
Сообщений: 10
По умолчанию

не помогло
подобная ошибка происходит почему то на всех значениях у которых старший 8-й бит равен 1-це

как то странно
ongleb вне форума Ответить с цитированием
Старый 30.07.2009, 12:51   #6
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

Цитата:
Сообщение от ongleb Посмотреть сообщение
Господа,
простите за дурацкий вопрос (5лет на С-диалекты не использовал)
пытаюсь читать файл
читается но помоему с ошибкой

------------------файл при просмотре в hex-mode--------------------
09 8d 09 78 09 63 09 4d ...
--------------------------

-------------------мой код (коротко без проверок)------------------
int err,val;
FILE *SourseFile;
char *bufer;

bufer=(char*)malloc(<filesize>*size of(int));
SourseFile=fopen(<filename>,"r");
err=fread(bufer,1,<filesize>,Sourse File);
val= bufer[0]*256+bufer[1] ;
-----------------------------------------------------------------------

в результате выполнения bufer[0] и bufer[1] принимают значения
bufer[0] = 9 (0х09)
bufer[1] = -115 (0xFFFFFF8D) // должно быть 141 (0x8D)

может нельзя к такому буферу обращаться как к массиву?
или я читаю этот файл как то не так?
переменную bufer определи как unsigned char а не char , будет работать.
если есть нужна типизировать только как char то когда хош получить число пользуйя этой функцией
Код:
int Ord(char Word)
{
	unsigned char b = Word;
	return b;
}
почему то на рсусккие символы так реагирует. короче я и сам незнаю, но это работает ))

Stilet действительно не работает ))) именно тот порядок байт =) попробуй в своем тест-примере написать русские символы

Последний раз редактировалось lennon; 30.07.2009 в 12:53.
lennon вне форума Ответить с цитированием
Старый 30.07.2009, 13:05   #7
ongleb
Пользователь
 
Регистрация: 30.07.2009
Сообщений: 10
По умолчанию

спасибо
unsigned char помогло
ongleb вне форума Ответить с цитированием
Старый 30.07.2009, 13:08   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ниче не понял...
Есть файл
Цитата:
Это русский текстWaitForSingleObject return value 258
WaitForSingleObject return value 258
Я его читаю.
Код:
int _tmain(int argc, _TCHAR* argv[])
{
int err,val;
FILE *SourseFile;
char *bufer;

bufer=(char*)malloc(20);
SourseFile=fopen("C:\\temp\\bo_dump.txt ","r");
err=fread(bufer,1,20,SourseFile);
cout<<bufer;
MessageBoxA(GetForegroundWindow(),bufer,"",0);
getchar();
	return 0;
}
И В Месседж боксе вижу "Это русский текстW"

(Builder C++)
Или я вопроса не понял...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2009, 13:10   #9
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

кстате в билдере работает я ж забыл что вы пользуетеся билдером ))
lennon вне форума Ответить с цитированием
Старый 30.07.2009, 13:15   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Если мои коллеги, модераторы, не будут против я продолжу немного не в тему:
Просьба знатоков Си разьяснить мне в чем разница для моего примера в разных компиляторах, или указать мне о чем тут собсно идет разговор, ибо никак я не пойму какую же ошибку автор словил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при открытии файла Ciberal Общие вопросы Delphi 2 09.06.2009 22:58
ошибка при чтении файла Alik-Soldier Общие вопросы C/C++ 1 31.05.2009 20:44
Проблема при чтении из файла Satorin Общие вопросы Delphi 2 17.12.2008 11:32
Ошибка при чтении БД из файла!! sting БД в Delphi 4 14.12.2008 22:23
C++: ошибка при открытии файла Retiz Помощь студентам 2 30.08.2008 22:12