Почему ifstream не читает до конца? - PullRequest
1 голос
/ 25 апреля 2010

Я делаю программу, похожую на блокнот.Чтобы получить текст из файла, я считываю каждый символ в буфер, выполняя

while (!file.EOF())
{
  mystr += file.get();
}

, однако, если я загружаю в exe, он останавливается после MZ, но Notepad читает весь exe.Я установил свой ifstream в бинарный режим, но все равно не повезло.Что я делаю неправильно?Спасибо

код: (грязно)

void LoadTextFromString(HWND ctrl, char* dirtypath, bool noquotes)
{
char *FileBuffer;

char *buf;

int count;
count = 0;

bool hasDot = false;
vector<int> quotes;
vector<string> files;
string temp;


if (noquotes)
{

    goto noqu;
}

while(dirtypath[count] != 0)
{
    if (dirtypath[count] == 34)
    {
        quotes.push_back(count);
    }
    count +=1;
}
if (quotes.size() < 3 || quotes.size() % 2 != 0)
{
    return;
}

for (int i = 0; i < quotes.size(); i += 2)
{

    temp = "";
    for (int j = quotes[i] + 1; j < quotes[i + 1]; ++ j)
    {
        temp += dirtypath[j];
    }

    files.push_back(temp);
}

for(int i = 0; i < files.size(); ++i)
{
noqu:
if (!noquotes)
{
FileBuffer = (char*)files[i].c_str();
}
else
{
FileBuffer = dirtypath;
}



ifstream *tf;
tf = new ifstream(FileBuffer,ios::binary);

ifstream *file;
file = new ifstream(FileBuffer,ios::binary);
if(file->fail())
{
    return;
}
int thelength;
thelength = 0;

while (!tf->eof())
{
    if (tf->get() == 10)
    {
        thelength +=1;
    }

    thelength +=1;
}
tf->close();

if(thelength == 0)
{
    SetWindowTextA(ctrl,"");
    return;
}
buf = new char[thelength + 1];

int lenn;
lenn = 0;
char cr ;
cr = 10;
char tmp;

while (!file->eof())
{

    buf[lenn] = file->get();
    if (buf[lenn] == cr) 
    {
        tmp = 13;
        buf[lenn] = tmp;

        buf[lenn + 1] = cr;
        lenn += 1;
    }
    lenn += 1;



}
buf[lenn - 1] = 0;

file->read(buf,lenn);
SetWindowTextA(ctrl,buf);
file->close();

}
delete(buf);

}

1 Ответ

3 голосов
/ 25 апреля 2010

однако, если я загружаю в exe, он останавливается после MZ

файл типа .exe может содержать все виды байтов, даже 0, вам необходимо проверить значение байта перед добавлением в строку.

относительно MZ

...