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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2013, 10:30   #1
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию Один файл - разное содержимое

Не понимаю как так происходит. Есть файл z.txt, в нем записан один символ: "1". Этот файл создан в каталоге C:\1 и скопирован в каталог C:\2. При считывании этих двух файлов в бинарном виде первым символом действительно выводится единица, а дальше вместо нулей какая-то чепуха. Посмотрите пожалуйста:

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <fstream.h>
#pragma hdrstop

void ReadBinary(char *FilePath,char *FilePath2);

char sPath[MAX_PATH]= "C:\\1\\z.txt";
char sPath2[MAX_PATH]="C:\\2\\z.txt";

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

#pragma argsused
int main(int argc, char* argv[])
{
    ReadBinary(sPath,sPath2);
    system("PAUSE");
    return 0;
}

void ReadBinary(char *FilePath,char *FilePath2)
{
  char *Buffer = NULL;
  char *Buffer2 = NULL;
  TFileStream *PktFile = NULL;
  TFileStream *PktFile2 = NULL;
      if ( FileExists( FilePath ) && FileExists( FilePath2 ) ){ //если файлы по указанному пути существуют
        PktFile = new TFileStream( FilePath, fmOpenRead | fmShareDenyNone ); 
        PktFile2 = new TFileStream( FilePath2, fmOpenRead | fmShareDenyNone ); //инициализируем два объекта для каждого файла
	if ( PktFile ){ //если все удачно
	  Buffer = new char[ PktFile->Size+1 ];   //инициализируем буфер
	  PktFile->ReadBuffer( Buffer, PktFile->Size ); //cчитали байт сколько нужно
          }
        if ( PktFile2 ){ //то же самое со вторым файлом
	  Buffer2 = new char[ PktFile2->Size+1 ];
	  PktFile2->ReadBuffer(Buffer2, PktFile2->Size );
          }
         
        printf("%d\n",(int)(PktFile->Size)); //размер 1 байт
        printf("%d\n",(int)(PktFile2->Size)); //размер 1 байт
 
        if (PktFile->Size == PktFile2->Size) //условие: выполнить если размеры совпадают
{
          printf("%d\n",(int)Buffer[1]); //здель лежит 122
          printf("%d\n",(int)Buffer2[1]); //здесь лежит 0
}  
        }
          }
Как?! В Buffer[0] и Buffer2[0] лежит 49, что идентично единице. Каким образом в следующем элементе появился 122? Если я правильно понимаю логику - дальше должны лежать нули(они и лежат). В чем ошибка? Может что-то упустил?
Baburek вне форума Ответить с цитированием
Старый 09.07.2013, 10:36   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

new char только выделит память, нужные данные нужно записать самому.
Где у вас запись нулей?
waleri вне форума Ответить с цитированием
Старый 09.07.2013, 10:37   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

зачем Вы иницилизируете (выделяете память ) буфер на Size+1 - выделяете на Size

читаете Вы Size байт (в вашем случае это 1 (один) байт). Что там лежит после - это МУСОР. Почему и какой мусор там лежит - вас волновать НЕ ДОЛЖНО! Ну или иницилизируйет (заполняйте массивы нулями перед чтением файла)


Цитата:
Сообщение от waleri Посмотреть сообщение
new char только выделит память, нужные данные нужно записать самому.
Где у вас запись нулей?
+1
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.07.2013, 10:45   #4
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

я так понимаю, что мне остается сделать только так:

Код:
 
int p=(int)(PktFile->Size);

for (int i=0; i<p;i++){
          printf("%d\n",(int)Buffer[i]); 
          printf("%d\n",(int)Buffer2[i]);
          }
Почему меня "ВОЛНУЕТ МУСОР": если файлов очень много и они разных размеров, то полный размер каждого считывается довольно долго. Я хотел взять один мегабайт каждого файла и считать. Но он сам нули не заполняет и мне так или иначе нужно написать проверку для этого дела(если я хочу сделать условие чтения не по файлу полностью, а по угодному мне размеру). Имею в виду проверку, что размер файла не меньше чем я хочу считать. Я верно понимаю?

Последний раз редактировалось Baburek; 09.07.2013 в 10:54. Причина: добавление причины
Baburek вне форума Ответить с цитированием
Старый 09.07.2013, 11:29   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Baburek Посмотреть сообщение
я так понимаю, что мне остается сделать только так:
Код:
 
int p=(int)(PktFile->Size);

for (int i=0; i<p;i++){
          printf("%d\n",(int)Buffer[i]); 
          printf("%d\n",(int)Buffer2[i]);
          }
угу. точно так. но это только при условии, что размер у файлов - одинаков.

Цитата:
Сообщение от Baburek Посмотреть сообщение
Почему меня "ВОЛНУЕТ МУСОР": если файлов очень много и они разных размеров, то полный размер каждого считывается довольно долго. Я хотел взять один мегабайт каждого файла и считать. Но он сам нули не заполняет и мне так или иначе нужно написать проверку для этого дела(если я хочу сделать условие чтения не по файлу полностью, а по угодному мне размеру). Имею в виду проверку, что размер файла не меньше чем я хочу считать. Я верно понимаю?
Ничего не понимаю...
Вы нас спрашиваете, правильно ли Вы делаете, не объяснив, какую изначально задачу Вы решаете!
Если задача стоит сравнить файлы - то Вы делаете неправильно. Ну и что, что первый мегабайт совпадает, остальные XXX мегабайт Вас уже не интересуют?
И ещё, насчёт мусора. Запомните, брать из буфера можно ровно столько значений, сколько Вы туда положили. Обнулять остальные в этом случае не нужно!
Допустим, есть буфер (массив) на миллион байт.
Вы прочитали из файла в этот буфер 10 байт. Так вот, и брать из буфера Вы можете только 10 байт. Больше - ни на один байт Вы брать права не имеете!

надеюсь, я понятно выразил своё мнение?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.07.2013, 11:47   #6
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
надеюсь, я понятно выразил своё мнение?
Более чем) Огромное спасибо за развернутый ответ.
+
Baburek вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
bat файл редактирующий содержимое Айвенго Операционные системы общие вопросы 1 02.03.2012 09:15
записать содержимое Listview в файл Leo20 Общие вопросы Delphi 0 26.11.2009 13:01
Записать содержимое буфера обмена в файл. sw3n Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 17.07.2009 02:39
Ссылка на файл из текущей папки! Сбор инфы в один файл! mephist Microsoft Office Excel 11 10.07.2009 13:51