2016-12-12 3 views
-3

Это мой первый подход с fread() и fwrite() функции. Поэтому я изучаю, как с ними бороться. Для текстовых файлов мне удалось прочитать a, а затем создать файл в другой функции. Но, всякий раз, когда я пытаюсь использовать нетекстовые файлы, они просто выводят повреждение. Я спрашиваю здесь, потому что у меня не было достаточных результатов для поиска этого вопроса по интернету.Как правильно fread() и fwrite() не текстовый файл?

Вкратце: я отправляю данные из файла, который я открыл на сервере для клиента, а затем клиент пытается создать точный файл с обработанными данными.

Итак, позвольте мне объяснить, как я это делаю: открыть неофициальный текстовый файл в двоичном режиме:

FILE* myfile = fopen(fullPath.c_str(), "rb"); 

Затем я создаю цикл для чтения через файл: (по какой-то причине я» ве обнаружили, что реальный размер, не текстовый файл равен size/4)

int readPos = 0; 
std::string externalBuffer; 

while (true) { 
    unsigned char buffer[1024]; 
    int bytesRead = 0; 

    bytesRead += fread(buffer, sizeof(unsigned char), 1024, upfile);  

    if (bytesRead == 0) 
     break; 

    externalBuffer = unsigned_char_to_string(buffer, bytesRead); //This simple function loops over the buff and converts each entry to the string -> the results are numbers from 0-255 

//Here I convert the buffer to a string and send it to the client to be parsed and add to a string buffer like: dataChunk += parsedString; 

//clear buffers 

} 

Теперь я разбор sucessfuly строки на клиенте (я не уверен, если проблема коррупции лежит в моем обращении буфера к строке). После того, как все данные из цикла отправлены. Клиент пытается записать затем с помощью буфера dataChunk:

FILE* myfile = fopen(fullPath.c_str(), "wb+"); 
fwrite(dataChunk.c_str(), sizeof(char), dataChunk.size(), myfile); 
fclose(myfile); 

Я уже пытался преобразовать данные, посылаемые в шестнадцатеричную строку, преобразование каждой записи 0-255 его шестнадцатеричный и запись в новый файл. Я также попытался преобразовать строку dataChunk в массив unsigned char. Но все мои попытки привели к поврежденному файлу. Я использовал этот метод, чтобы попытаться создать исполняемый файл и png-изображение. Я также видел несколько примеров, которые затем fopen и копирует весь файл за один раз, а затем fwrite в новом созданном файле с той же функцией, что и для неподписанного символа.

Итак, что не так с этим кодом и почему он не выводит идеальный файл? Использую ли я fread() и fwrite() ошибочно?

+0

Что означает «они просто выводят повреждение»? – immibis

+1

Почему вы используете функции 'stdio' в C++-программе вместо классов C++? – Barmar

+0

@immibis файлы не выполняются так, как должны. Он не имеет размер он должен. Думаю, что да. – Xabirau

ответ

0

С корректировками @Barmar. Я изменил unsigned_char_to_string функцию этого кода:

std::string externalBuffer(&buffer[0], &buffer[0] + bytesRead); 

и он работал отлично!

Спасибо @Barmar! Извините за то, что вы нобеш :) Вы сделали мой день!

Смежные вопросы