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 и считайте себе на здоровье ...
|
|
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<
//_______________________________________________________________________________________________________________________
void __fastcall TForm1::Button2Click(TObject *Sender)
{if(OpenDialog1->Execute()){name=OpenDialog1->FileName;if(RadioButton1->Checked==true){txt=1;Button1->Click();}
else {txt=0;Button1->Click();}}}
И все бы хорошо , но проблемма в том что составленная моей программой таблица к предоставленному преподавателем текстовому файлу отличается от таблицы которая уже была у него для етого файла. И отличается всего одной ячейкой — ячейкой которая отвечает за частоту появления символа с кодом 0 (Символ NULL — код 0)
У таблицы преподавателя — сивол с кодом 0 встречается 29 раз, у меня ето значение равно 0(тоесть не встречается в файле ни разу).
Я предположыл что моя программа не считает ети символы. Поетому я обратился сюда на форум с вопросом который можно увидеть в начале темы.
Я вставил в свой программный код — код который предложыл beginner (За что ему огромное спасибо) но ето ни чего не дало.Таблица (далее гистограма) не изменила своего первого занчения (Значения количества NULL символов).Далее я решыл проверить, а не обнаружыт ли моя программа NULL сиволы в других файлах.Для етого я взял файл видео ролика и программа обнаружыла NULL символы (Причем приличное их количество).Путем еще нескольких проверок я понял что она считала ети проклятые NULL символы еще в первоначальном варианте, тоесть без куска кода beginner-а.Ну тогда я подумал на сам файл, для составления гистограмы, который дал мне препод, но так как не представляется возможность проверить правильность гистограммы, по етому файлу, преподавателя к предложенному им файлу(Поскольку он уверяет и гарантирует что она абсолютно правильна) я не могу понять — тогда в чем же моя программа не верна.
Прикрепляю архив с 3 файлами — текстовый файл для построения гистограммы+гистограмма препода+гистограмма построенная моей программой.
|
|
dayver2009 |
Отправлено: 03.12.2006, 22:56 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 26
|
...
for(int i=0;i<=255;i=i+8)outFile<
outFile<
//_______________________________________________________________________________________________________________________
void __fastcall TForm1::Button2Click(TObject *Sender)
{if(OpenDialog1->Execute()){name=OpenDialog1->FileName;if(RadioButton1->Checked==true){txt=1;Button1->Click();}
else {txt=0;Button1->Click();}}}
И все бы хорошо , но проблемма в том что составленная моей программой таблица к предоставленному преподавателем текстовому файлу отличается от таблицы которая уже была у него для етого файла. И отличается всего одной ячейкой — ячейкой которая отвечает за частоту появления символа с кодом 0 (Символ NULL — код 0)
У таблицы преподавателя — сивол с кодом 0 встречается 29 раз, у меня ето значение равно 0(тоесть не встречается в файле ни разу).
Я предположыл что моя программа не считает ети символы. Поетому я обратился сюда на форум с вопросом который можно увидеть в начале темы.
Я вставил в свой программный код — код который предложыл beginner (За что ему огромное спасибо) но ето ни чего не дало.Таблица (далее гистограма) не изменила своего первого занчения (Значения количества NULL символов).Далее я решыл проверить, а не обнаружыт ли моя программа NULL сиволы в других файлах.Для етого я взял файл видео ролика и программа обнаружыла NULL символы (Причем приличное их количество).Путем еще нескольких проверок я понял что она считала ети проклятые NULL символы еще в первоначальном варианте, тоесть без куска кода beginner-а.Ну тогда я подумал на сам файл, для составления гистограмы, который дал мне препод, но так как не представляется возможность проверить правильность гистограммы, по етому файлу, преподавателя к предложенному им файлу(Поскольку он уверяет и гарантирует что она абсолютно правильна) я не могу понять — тогда в чем же моя программа не верна.
Прикрепляю 3 файла — текстовый файл для построения гистограммы+гистограмма препода+гистограмма построенная моей программой.
|
|
BadMan |
Отправлено: 03.12.2006, 23:40 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 37
|
Исходя из постановки задачи я бы сделал массив int Counts[256], обнулил бы его, а дальше посимвольно из файла
char CurByte = Считываем очередной символ из файла;
Counts[CurByte]++;
10 строк — и на выходе получаем массив с нужными значениями по каждому символу от 0 до 255... |
|
|