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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение Бинарного Кода из Файла 
:(
    Опции темы
tht
  Дата 7.2.2007, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



в общем. ни как не могу прочитать в файле байты 0x00
типа это указывает что это конец файла.
 а мне нужно их прочесть и поместить в буфер
подскажи плиз как, с помощью стандартный функций прочитать такие символы как 0x00 и подобные.
заранее благодарю.
PM MAIL   Вверх
skyboy
Дата 7.2.2007, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(tht @  7.2.2007,  02:08 Найти цитируемый пост)
типа это указывает что это конец файла.

странно. ничего это не указывает. чем читаешь? код где?
PM MAIL   Вверх
Fazil6
Дата 7.2.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

типа это указывает что это конец файла.

недолжно.
как ты проверяешь конец файла?  
PM MAIL   Вверх
tht
Дата 7.2.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я вам реально говорю. не читает !!! короче есть 8 байт в файле, такого вида
0xE2 0x03 0x00 0x00 0x00 0x58 0x48 0x4D

первый два байта читаются функциями любыми библиотеки stdio 
fread(); fgets(); fgetc(); и тп. остальные байты т.е. 0x00 не читаются, и указатель не уходит дальше них. а нада считать все имеющиееся байты включая эти нули 0x00. все 8 байтов.
PM MAIL   Вверх
vinter
Дата 7.2.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



tht, приведи код как ты читаешь из файл, а то так сложно что-то говорить..


--------------------
Мой блог
PM MAIL WWW   Вверх
tht
Дата 7.2.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

        fh = fopen("server_send.txt","r");
        fread(&rcvBuff,8,1,fh);
        fclose(fh);
        recv_count = strlen(rcvBuff);
        printf("%i BYTES READ. %s\n",recv_count,rcvBuff);

вы дает 2 байта прочитаных. и соотвественно выводит только этих два байта которые первые в файле.
PM MAIL   Вверх
Vyacheslav
Дата 7.2.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>

//---------------------------------------------------------------------------
using namespace std;
int main(int argc, char* argv[])
{
    ifstream in("Demo.exe", ios_base::binary);
    string fd = string(  istreambuf_iterator< char >(in), istreambuf_iterator< char >() );
    cout << hex;
    copy(fd.begin(), fd.end(), ostream_iterator< int, char >(cout, " ") );


    return 0;
}
//---------------------------------------------------------------------------
 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
skyboy
Дата 7.2.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



tht, ты записываешь данные в null-terminated строку. т.е. в список символов, концом которого(концом строки, а не файла!) считается символ с кодом 0. т.е. ты реально читаешь 8 байт. но помещаешь в структуру, из которой сможешь вытянуть только символы до первого кода ноль.
PM MAIL   Вверх
tht
Дата 7.2.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(skyboy @ 7.2.2007,  16:35)
tht, ты записываешь данные в null-terminated строку. т.е. в список символов, концом которого(концом строки, а не файла!) считается символ с кодом 0. т.е. ты реально читаешь 8 байт. но помещаешь в структуру, из которой сможешь вытянуть только символы до первого кода ноль.

и что мне с этим можно сделать ?

Vyacheslav спасибо. учту, но мне еще интересен другой вариант.

PM MAIL   Вверх
vinter
Дата 7.2.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата
и что мне с этим можно сделать ?


подумай, тут уже дело в обработке строки, а вообще можешь читать попеременно в переменную типа int и сразу выводить на экран


--------------------
Мой блог
PM MAIL WWW   Вверх
skyboy
Дата 7.2.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(tht @  7.2.2007,  15:50 Найти цитируемый пост)
и что мне с этим можно сделать ?

с чем? с 0-символами? сам решай. либо храни в массива char* и определяй его длину после чтения при помощи функций работы с файлом, либо сделай так, чтоб в файле не было 0 символов. 
PM MAIL   Вверх
tht
Дата 7.2.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



они там в файле 0x00 хоть как будут и должны быть. считайте что это протокол такой. которые изменить нельзя.
PM MAIL   Вверх
SerpentVV
Дата 7.2.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Цитата(tht @ 7.2.2007,  16:23)
Код

        fh = fopen("server_send.txt","r");
        fread(&rcvBuff,8,1,fh);
        fclose(fh);
        recv_count = strlen(rcvBuff);
        printf("%i BYTES READ. %s\n",recv_count,rcvBuff);

вы дает 2 байта прочитаных. и соотвественно выводит только этих два байта которые первые в файле.

1. По умолчанию ты открываешь файл как текстовый... Нужно прописать в fopen "rb"
2. Функция strlen  тебе до первого нуля и посчитает...
3. Выводишь ты их как строку - опять же выведется до нуля...

Добавлено @ 17:18 
Цитата(tht @ 7.2.2007,  17:15)
они там в файле 0x00 хоть как будут и должны быть. считайте что это протокол такой. которые изменить нельзя.

Тогда нельзя работать со строковыми функциями ибо они все до ближайшего нуля работают...

PM MAIL   Вверх
tht
Дата 7.2.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ничего не получается. я пробывал всяко как вы говорили я даже буфер сделал int rcvBuff[10];
видите ? целый... все равно чтение только первых двух байтов.
короче говоря не читает функция fread все 8 байтов, а только до нуля.
в то время как printf() способна вывести любые байты на экран.

Это сообщение отредактировал(а) tht - 7.2.2007, 18:12
PM MAIL   Вверх
SerpentVV
Дата 7.2.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Короче, приведи полный текст с объявлениями переменных и попытками вывода на экран...

PM MAIL   Вверх
tht
Дата 7.2.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[]){
    WSADATA wsaData;
    SOCKET SocketHandle, SocketServer;
    int socklen, recv_count, i;
    char rcvBuff[1025] = {0}, cmd;
    int intBuff[1025] = {0};
    FILE* fh;
    //fstream fr;
    sockaddr_in saddr_in, cl_addr;

    if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0){
        printf("Error startup %i\n",WSAGetLastError());
    }
    SocketHandle = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(SocketHandle == INVALID_SOCKET){
        printf("Error Socket %i\n",WSAGetLastError());
    }

    printf("Enter S or C\n");
    cmd = getch();

    if(cmd == 's'){
        fh = fopen("server_send.txt","rb");
        fread(&intBuff,8,1,fh);
        fclose(fh);

        rcvBuff

        memcpy(&rcvBuff,&intBuff,8);
        printf("%i\n");
        printf("%s\n",&intBuff);

        saddr_in.sin_addr.s_addr = inet_addr("10.10.0.50");
        saddr_in.sin_family = AF_INET;
        saddr_in.sin_port = htons(14759); //14759, 35920

        if(bind(SocketHandle,(SOCKADDR*)&saddr_in,sizeof(saddr_in)) == SOCKET_ERROR){
            printf("Error Bind %i\n",WSAGetLastError());
        }
        if(listen(SocketHandle,1024) == SOCKET_ERROR){
            printf("Error Listen %i\n",WSAGetLastError());
        }
        SocketServer = SOCKET_ERROR;
        while(SocketServer == SOCKET_ERROR ){
            SocketServer = accept(SocketHandle,NULL,NULL);
        }
        send(SocketHandle,rcvBuff,2,0);
        memset(&rcvBuff,0,1024);
        recv_count = recv(SocketHandle,rcvBuff,1024,0);
        printf("%i BYTES RECIVE. %s\n",recv_count,rcvBuff);
        closesocket(SocketServer);
    }

    if(cmd == 'c'){
        saddr_in.sin_addr.s_addr = inet_addr("10.10.0.3");
        saddr_in.sin_family = AF_INET;
        saddr_in.sin_port = htons(14759); //14759, 35920

        connect(SocketHandle,(SOCKADDR*)&saddr_in,sizeof(saddr_in));
        recv_count = recv(SocketHandle,(char*)rcvBuff,1024,0);
        fh = fopen("server_send.txt","w+b");
        printf("%i BYTES. %s\n",recv_count,rcvBuff);
        fwrite(&rcvBuff,recv_count,1,fh);
        fclose(fh);
    }

    closesocket(SocketHandle);
    WSACleanup();
    printf("\npress any key\n");
    getch();
    return 0;
}

PM MAIL   Вверх
vinter
Дата 7.2.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Код

int nVariable = 0;
while(!feof(file))
{
   fscanf(file, "%d", &nVariable);
   printf("%d", nVariable)
} 

и фсе

Это сообщение отредактировал(а) vinter - 7.2.2007, 18:42


--------------------
Мой блог
PM MAIL WWW   Вверх
SerpentVV
Дата 7.2.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Сделай вот так:

char buf[1000] ={0};
//...
int num = fread(buf, sizeof(char), 8, file);

В num получишь реально прочитанное количество байтов
Советую читать в байтовый массив, а не в интовский...

PM MAIL   Вверх
tht
Дата 7.2.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



vinter попробывал. вылетает ошибка программы.
SerpentVV результат тот же самый что и был у меня... т.е. 2 байта.
PM MAIL   Вверх
vinter
Дата 7.2.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



tht, покажи как ты сделал с моим кодом
Цитата
вылетает ошибка программы.

привыкни приводить полность ошибку, а не "у меня ошибка.."


--------------------
Мой блог
PM MAIL WWW   Вверх
tht
Дата 7.2.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



короче я наконец то вас всех понял... и сделал так
Код

        fh = fopen("server_send.txt","rb");
        while(!feof(fh)){
            ch = fgetc(fh);
            printf("%c",ch);
            rcvBuff[i] = ch;
        }
        fclose(fh);


странно но почему rcvBuff не выводит все данные а опять же только эти 2 байта первых ?
 в то время как из сети, от все 8 байтов сгружает нормально и нормально в полном виде выводит. это когда я как клиент подключаюсь.
PM MAIL   Вверх
SerpentVV
Дата 8.2.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Цитата(tht @ 7.2.2007,  19:12)
короче я наконец то вас всех понял... и сделал так
Код

        fh = fopen("server_send.txt","rb");
        while(!feof(fh)){
            ch = fgetc(fh);
            printf("%c",ch);
            rcvBuff[i] = ch;
        }
        fclose(fh);


странно но почему rcvBuff не выводит все данные а опять же только эти 2 байта первых ?
 в то время как из сети, от все 8 байтов сгружает нормально и нормально в полном виде выводит. это когда я как клиент подключаюсь.

Потому что выводить нужно вот так:
Код

            printf("%i", static_cast<int>(ch));

То есть ты выведешь символ как ЦЕЛОЕ... Ноль как символ не выводится...


Это сообщение отредактировал(а) SerpentVV - 8.2.2007, 15:19
PM MAIL   Вверх
tht
Дата 8.2.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а вот и НЕТ. выводиться
printf("%c",ch); - это выводит все до последнего байта включая НУЛИ. просто на экране символов 0x00 не видно так как они ничего не значат, точнее говоря это выглядит так будто там пробелы вывелись.
 а я cпросил про переменную rcvBuff, пытаюсь вывести ее вс. целиком на экран printf("%s",rcvBuff); выводятся только первые два байта, до нуля.
 НО, когда я эти данные, 8 байтов, получаю из сети в эту переменную и вывожу printf("%s",rcvBuff); на экран всё выводится нормально, все 8 байтов. т.е. даже НУЛИ, которые на экране похожи на пробелы, так как их не видно.
 только в одном случае не выводятся, в том когда я загружаю эти же данные из ФАЙЛА.
PM MAIL   Вверх
comcon1
Дата 11.2.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



кароче
Код

struct simplstr {
 char buf[500];
 int len;
}

читай в такие структы. тебе правильно сказали. и len задавай исходно.


--------------------
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0664 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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