tags:

views:

175

answers:

1

I'm making a notepad-like program. To get the text from a file I read each character into the buffer by doing

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

however if I load in an exe it stops after MZ but Notepad reads the whole exe. I set my ifstream to binary mode but still no luck. What am I doing wrong? Thanks

code: (messy)

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);

}
+3  A: 

however if I load in an exe it stops after MZ

a file of type .exe can contain all kinds of bytes even 0's, you would need to check the byte value before appending to the string.

regarding MZ

Anders K.
forgot to check for null, thanks
Milo