2013-07-28 22 views
2

我正在寫一個C++的小型DLL,它將從Web服務器上下載一個文件。下載部分工作正常,但是當我去寫磁盤上的文件時,它會在每一行上添加額外的字符。fstream正在爲我的文件的每一行添加字符?

當我在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; 

}

+1

這看起來比'C++'更給我'C' – user2485710

+0

當你用一個調試器完成它時,在哪個階段添加額外的換行符? –

回答

5

做貴方覺得到ofstream的對象上使用二進制模式的第一件事:

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

這將防止ofstream的從modyfying weriten數據,在缺省情況下完成的(在文本模式下)。

+1

真棒,工作。謝謝。我沒有意識到,如果數據不是二進制模式,那麼數據流可以修改數據。感謝你的回答。 – Zalerinian

相關問題