C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Подсчет NULL символов, сканирование файла
dayver2009
Отправлено: 01.12.2006, 18:57


Ученик-кочегар

Группа: Участник
Сообщений: 26



Здравствуйте Все!Прошу помочь мне в таком вопросе:

Как осуществить подсчет количества NULL символов (По таблице ASCII ето символ с кодом = "0" Для примера символ "S" имеет код 83, а "w" — 119) в файле?
Тоесть нужно присвоить переменной int n число равное количеству NULL символов в файле "fail.txt" где String OpenNametxt="fail.txt";
Doga
Отправлено: 01.12.2006, 21:31


Мастер участка

Группа: Участник
Сообщений: 575



А в чём, собственно, проблема? Открывайте файл в TFileStream и считайте себе на здоровье smile.gif ...
dayver2009
Отправлено: 01.12.2006, 22:50


Ученик-кочегар

Группа: Участник
Сообщений: 26



А по конкреней нельзя? ПОЖАЛУЙСТА
Grigoriy
Отправлено: 02.12.2006, 06:38


Мастер участка

Группа: Участник
Сообщений: 381



Проверял на файлах по 700 МБ. Работает.
Но должна правильно работать и на файлах больше чем 4 ГБ.
CODE

//Функция возвращает количество NULL-символов в файле с именем filename
//в случае ошибки функция возвращает -1
//возвращаемое значение имеет тип __int64
__int64 CountNULLCharInFile(char* filename);
__int64 CountNULLCharInFile(char* filename)
{
void* f;
void* b;
unsigned int n,k,k1;
void* pn;
if ((f=CreateFile(filename,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0))==(void*)-1)
return -1;
asm
{
pushad;
mov k,0;
mov k1,0;
lea eax,n;
mov pn,eax;
cld;
push 8388608;
push 0;
call GlobalAlloc;
mov b,eax;
@c1:push 0;
push pn;
push 8388608;
push b;
push f;
call ReadFile;
mov ecx,n;
or ecx,ecx;
jz @p2;
mov edi,b;
xor al,al;
@c2:repne scasb;
jnz @c1;
add k,1;
adc k1,0;
or ecx,ecx;
jnz @c2;
jmp @c1;
@p2:
push b;
call GlobalFree;
push f;
call CloseHandle;
popad;
mov eax,k;
mov edx,k1;
};
};


Отредактировано Grigoriy — 02.12.2006, 06:40
beginner
Отправлено: 02.12.2006, 09:28


Дежурный стрелочник

Группа: Участник
Сообщений: 44



CODE
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILE *in;

if((in = fopen("C:\\FAIL.TXT", "rb"))==NULL)
{
ShowMessage("Ошибка при открытии файла");
return;
}

int cnt = 0;
while(!feof(in))
if(!fgetc(in))cnt++;

fclose(in);

ShowMessage("Файл содержит " + IntToStr(cnt) +
" нулевых символов.");
}


Отредактировано beginner — 02.12.2006, 20:32
dayver2009
Отправлено: 03.12.2006, 22:35


Ученик-кочегар

Группа: Участник
Сообщений: 26



Спасибо за предлженные коды!

Но возникла другая проблемма.
Поясню кратко в чем ее суть:
Мой преподаватель дал задание зделать программу которая составляла бы таблицу значений частоты появлений символов таблицы ASCII в тестируемом файле (Например — Символ с кодом 0 встретился в файле 12 раз, символ с кодом 1 встретился в файле 4364 раз , символ с кодом 2 встертился в файле 0 раз , .... , символ с кодом 255 встретился в файле 65 раз) и выводила ету таблицу в текстовый или екселевский файл. Я зделал программу которая имеет такой код

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "Unit1.h"
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//_______________________________________________________________________________________________________________________
String name;int txt=2;
//_______________________________________________________________________________________________________________________
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{}
//_______________________________________________________________________________________________________________________
void __fastcall TForm1::ExcelInit(String File)
{try {App=Variant::CreateObject("Excel.Application");}
catch (...) {Application->MessageBox("Невозможно открыть Microsoft Excel!"
"Возможно Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);}
try {if(File!="")App.OlePropertyGet("WorkBooks").OleProcedure("Open",File);
else App.OlePropertyGet("WorkBooks").OleProcedure("add");Sh=App.OlePropertyGet("WorkSheets",1);}
catch(...) {Application->MessageBox("Ошибка открытия книги Microsoft Excel!","Ошибка",MB_OK+MB_ICONERROR);}}
//_______________________________________________________________________________________________________________________
void __fastcall TForm1::toExcelCell(int Row,int Column, AnsiString data)
{try {Variant cur = Sh.OlePropertyGet("Cells", Row,Column);cur.OlePropertySet("Value", data.c_str());}
catch(...) { ; }}
//_______________________________________________________________________________________________________________________
void __fastcall TForm1::Button1Click(TObject *Sender)
{std::ifstream inFile(name.c_str(),std::ios::binary);std::vector T(8);std::vector buf(1);
int j,V[256]={0};float H=0,r=0;AnsiString entropia="",s=""; //FILE *in;int cnt=0;

do{std::streamsize count=inFile.read(&buf[0],buf.size()).gcount();if(count==0) break;
for(int i=0;i(buf[i]).to_string,std::allocator>());
std::transform(tmp.begin(),tmp.end(),T.begin()+i*8,std::bind2nd(std::equal_to(),'\x31'));}
j=T[0]*128+T[1]*64+T[2]*32+T[3]*16+T[4]*8+T[5]*4+T[6]*2+T[7]*1;V[j]=V[j]+1;}
while(inFile.good());j=0;

// if((in=fopen(name.c_str(),"rb"))==NULL){ShowMessage("Ошибка при открытии файла");return;}
// while(!feof(in))if(!fgetc(in))cnt++;fclose(in);V[0]=cnt;

for(int i=0;i<=255;i++)r=r+V[i];
for(int i=0;i<=255;i++){if(V[i]!=0.0)H=H+((V[i]/r)*((log10(V[i]/r))/(0.30102)));}
entropia=FloatToStr(fabs(H));
if(txt==0){ExcelInit("");
for(int i=0;i<256;i++){s=IntToStr(V[i]);if(i%8==0)j++;toExcelCell((j),((i%8)+1),String(s));}
toExcelCell(34,1,String(entropia));
if(!App.IsEmpty())App.OlePropertySet("Visible",true);
try{App.OlePropertyGet("WorkBooks",1).OleProcedure("SaveAs","Gistogramma");}
catch(...){ShowMessage("Не забудьте сохранить сделанные изменения !");}
Sh.Clear();App.Clear();}
if(txt==1){std::ofstream outFile((name+"_gistograma.txt").c_str(),std::ios::app);
for(int i=0;i<=255;i=i+8)outFile< outFile<