2

Web サーバーからファイルをダウンロードする小さな DLL を C++ で作成しています。ダウンロード部分は正常に動作しますが、ディスクにファイルを書き込もうとすると、すべての行に余分な文字が追加されます。

Notepad++ で元のファイル (Web サーバーにコピーされたファイル) を見ると、各行の末尾に CR と LF (キャリッジ リターンとライン フィード) の文字が含まれていることがわかります。ただし、保存されたバージョンでは、代わりに

line of textCRLF

のように見える

line of textCR
CRLF
CR
CRLF
Another line of text...

私はそれを引き起こしているものを見つけることができませんでした。(o)fstream に何らかの問題がありますか?

extern "C" void TCP_get_file(char *server, char *path, char *filename){
ofstream logfile("Crashlog.txt");
WSAData wsadata;
if ((WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0){
    logfile << "Error starting winsocks." << endl;
    WSACleanup();
    return;
}
int status, sock, received;
struct addrinfo hints, *servinfo;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((status = getaddrinfo(server, "http", &hints, &servinfo)) != 0){
    logfile << "Error getting server info:  " << gai_strerror(status) << endl;
    WSACleanup();
    freeaddrinfo(servinfo);
    return;
}
sock = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
connect(sock, servinfo->ai_addr, servinfo->ai_addrlen);
string request = string("GET ") + path + " HTTP/1.0\nhost: " + server + "\r\n\r\n";
if (send(sock, request.c_str(), strlen(request.c_str()), 0) == -1){
    logfile << "Error sending request to server." << endl;
    freeaddrinfo(servinfo);
    closesocket(sock);
    WSACleanup();
    return;
}
char filebuffer[5000];
string full, file;
while ((received = recv(sock, filebuffer, 4999, 0)) > 0){
    full.append(filebuffer, received);
    ZeroMemory(filebuffer, 4999);
}
full.push_back("\0");
int offset = full.find("\r\n\r\n") + 4;
file.assign(full, offset, full.size());
ofstream savefile(filename);
savefile << file;
savefile.flush();
savefile.close();
freeaddrinfo(servinfo);
closesocket(sock);
WSACleanup();
return;

}

4

1 に答える 1

5

最初に行うことは、ofstream オブジェクトでバイナリ モードを使用することです。

ofstream savefile(filename, std::ofstream::binary);

これは、ofstream が、デフォルトで (テキスト モードで) 行われる、適切なデータを変更するのを防ぎます。

于 2013-07-28T07:42:39.593 に答える