Рейтинг:
7
OriginalGriff
Цитата:
Вот что я получаю в lBytesRead при отладке
"lBytesRead 44 unsigned int"
Таким образом, то, что было прочитано, составляет 44 байта из возможных максимум 50. Таким образом, 44 байта будут переданы в буфер yoru, а остальные элементы никак не будут затронуты; их предыдущее содержимое - случайное в соответствии с вашим фрагментом кода - останется таким же, как и было. Это может создать впечатление "случайных данных в конце", и никакой завершающий null '\0' не будет добавлен. Поэтому, если вы напечатаете массив в виде строки, предполагая, что это допустимая строка с нулевым завершением, вы получите случайный мусор после ваших фактических данных.
Кроме того, Read действительно предназначен для двоичных данных, он не учитывает содержимое файла. Поэтому проверьте свой файл с помощью шестнадцатеричного редактора и убедитесь, что он содержит текст, и только текст: если он содержит двоичные данные, то вы получите двоичные данные, которые могут быть не сразу напечатаны! Используйте отладчик для сравнения содержимого файла, показанного в шестнадцатеричном редакторе, с фактическим содержимым вашего массива.
rmds
Спасибо! ты открываешь мне глаза
OriginalGriff
Всегда пожалуйста!
rmds
У меня есть еще одно сомнение. Я отправляю файл с сервера на клиент с помощью CSocket. Я звоню Socketid.Receive() в клиентском конце. Где будет получен текстовый файл? Вот этот фрагмент.
"Серверная часть"
ULONGLONG dwLength = исходный файл.Метода getlength может служить метод();
char* buffer = new char[(int)dwLength + 1];
буфер[dwLength] = 0;
UINT nActual = sourceFile.Read(буфер, dwLength);
if(DataBytes == SOCKET_ERROR) {
AfxMessageBox(L"ошибка при отправке");
вернуть;
}
nActual = nActual - DataBytes;
}
"Клиентская Часть"
char *pBuf =новый символ [1025];
CString strData;
инт илен;
илен=m_SocketClient.Прием(pBuf,1024);
После запуска этого кода я не нахожу никакого текстового файла в папке клиента.
OriginalGriff
Ну нет ... он не сохранит его на диск, если вы явно не скажете ему об этом!
rmds
Есть ли способ сохранить файл на диск... вместо CFile::ModeCreate, а затем записать его в файл? Я не хочу создавать файл, а затем писать в него. Спасибо!
Rick York
Если это консольное приложение, вы можете записать его в stdout, а затем перенаправить в файл. Если это приложение с графическим интерфейсом, то вам придется открывать, записывать и закрывать файл.
OriginalGriff
Вы не можете писать в файл, не открыв его каким-либо образом, не записав в него данные и не сохранив их.
Даже предложение Рика делает это!