В C ++ я пытаюсь полностью читать файлы, char за char, используя stdio.h (fopen, getc и т. Д.).
Я сделал программу, которая создает окно проводника и подсчитывает буквы (и количество байт) внутри выбранного файла.
Кажется, он работает правильно для файлов .txt, но с другими форматами файлов он не работает. Может кто-нибудь объяснить, почему и как это исправить?
Можно ли программой определить также размер на диске?
Исходный код 3:
Основной код:
#include "OpenFileDialog.h"#include <stdio.h>
#include <stdlib.h>
int main(void){
OpenFileDialog* openFileDialog1 = new OpenFileDialog();
openFileDialog1->FilterIndex = 1;
openFileDialog1->Flags |= OFN_SHOWHELP;
openFileDialog1->InitialDir = (TCHAR*)("C:\\Users\\Luca\\Documents");
openFileDialog1->Title = (TCHAR*)("Open Text File");
long long int number=0;
if (openFileDialog1->ShowDialog())
{
//MessageBox(0, openFileDialog1->FileName, "File selected",MB_OK | MB_ICONINFORMATION);
}
FILE * pFile;
char c;
int eofnbr=0;
int charnbr[256];
int otherschar=0;
char messageString1[2000];
char catString[200];
memset(charnbr,0,sizeof(messageString1));
memset(charnbr,0,sizeof(charnbr));
pFile = fopen(openFileDialog1->FileName,"r");
if (pFile==NULL){
return -1;
}
else{
int eofflag=0;
do{
do{
c = getc (pFile);
if((c>=0)&&(c<=255)){
charnbr[c]=charnbr[c]+1;
}
else
otherschar++;
if(c==EOF){
eofnbr++;
}
number++;
} while (c != EOF);
eofflag=feof(pFile);
} while(eofflag==0);fclose (pFile);
for(int i=0;i<256;i=i+8){
sprintf(catString,"%d = %d\t%d = %d\t%d = %d\t%d = %d\t%d = %d\t%d = %d\t%d = %d\t%d = %d\n",i,charnbr[i],i+1,charnbr[i+1],i+2,charnbr[i+2],i+3,charnbr[i+3],i+4,charnbr[i+4],i+5,charnbr[i+5],i+6,charnbr[i+6],i+7,charnbr[i+7]);
strcat(messageString1,catString);
}
sprintf(catString,"others = %d\t EOF = %d\t\t%d Byte\n ",otherschar,eofnbr, number);
strcat(messageString1,catString);
}
MessageBox(0, messageString1, "File selected",MB_OK | MB_ICONINFORMATION);
return 0;
}
Функции проводника:
#include "OpenFileDialog.h"
OpenFileDialog::OpenFileDialog(void)
{
this->DefaultExtension = 0;
this->FileName = new TCHAR[MAX_PATH];
this->Filter = 0;
this->FilterIndex = 0;
this->Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
this->InitialDir = 0;
this->Owner = 0;
this->Title = 0;
}
bool OpenFileDialog::ShowDialog()
{
OPENFILENAME ofn ;
TCHAR* explorerFolder= this->InitialDir;
ZeroMemory(&ofn, sizeof(ofn));ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = this->Owner;
ofn.lpstrDefExt = this->DefaultExtension;
ofn.lpstrFile = this->FileName;
ofn.lpstrFile[0] = '\0';
//ofn.lpstrFile = explorerFolder;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = this->Filter;
ofn.nFilterIndex = this->FilterIndex;
ofn.lpstrInitialDir = explorerFolder;
//ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = this->Title;
ofn.Flags = this->Flags;
GetOpenFileName(&ofn);if (_tcslen(this->FileName) == 0) return false;
return true;
}
Библиотека проводника:
#pragma once
#include <Windows.h>
#include <Commdlg.h>
#include <tchar.h>
class OpenFileDialog
{
public:
OpenFileDialog(void);
TCHAR* DefaultExtension;
TCHAR* FileName;
TCHAR* Filter;
int FilterIndex;
int Flags;
TCHAR* InitialDir;
HWND Owner;
TCHAR* Title;
bool ShowDialog();
};
Задача ещё не решена.
Других решений пока нет …