2015-06-04 49 views
1

讀取大文本文件後的垃圾我用C/C++編寫的示例程序將文本文件讀入內存。在試圖解析這個文件時(不是本示例的一部分),我在文件結尾附近發現了大量垃圾。調查這一點,我發現在將大文件讀入內存時存在一些問題;小規模文本文件不會發生此問題。這裏是我的代碼:使用(FILE *)

#include <conio.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

using namespace std; 

char* readFile_(char* fname) 
{ 
    char* rv=NULL; 
    int bytes=0; 
    FILE* pfile = NULL; 
    pfile = fopen(fname, "r"); 
    if (pfile) 
    { 
     fseek(pfile, 0, SEEK_END); 
     bytes = ftell(pfile); 
     fseek(pfile, 0, SEEK_SET); 
     rv = new char[bytes+1]; 
     memset(rv,0,bytes+1); 
     fread(rv, bytes, 1, pfile); 
     fclose(pfile); 
    } 
    return rv; 
} 

int main(int argc, char **argv) 
{ 
    char* filebuffer = NULL; 
    filebuffer = readFile_("mv2.txt"); 

    FILE* pfile = fopen("op.txt", "w"); 
    int len = strlen(filebuffer); 
    fwrite(filebuffer, len, 1, pfile); 
    fclose(pfile); 

    delete[] filebuffer; 
    return 0; 
} 

僅供參考,文件都在這裏舉行:

mv2.txt文件:https://gist.github.com/anonymous/bb101393729d3ada944f
op.txt文件:https://gist.github.com/anonymous/93595c83ad62e40d0f0a

誰能突出什麼似乎是問題?

編輯:我使用的是Windows(Windows 7操作系統)

編輯2:謝謝大家幫我看看這個問題,這裏是根據一些您反饋的更新的代碼,這似乎解決了我的問題,甚至對一些非常大的文本文件:

#include <conio.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

using namespace std; 

char* readFile_(char* fname) 
{ 
    char* rv=NULL; 
    long bytes=0; 
    FILE* pfile = NULL; 
    pfile = fopen(fname, "rb"); 
    if (pfile) 
    { 
     fseek(pfile, 0, SEEK_END); 
     bytes = ftell(pfile); 
     fseek(pfile, 0, SEEK_SET); 
     rv = new char[bytes+1]; 
     memset(rv,0,bytes+1); 
     fread(rv, bytes, 1, pfile); 
     fclose(pfile); 
    } 
    return rv; 
} 

int main(int argc, char **argv) 
{ 
    char* filebuffer = NULL; 
    filebuffer = readFile_("mv2.txt"); 

    FILE* pfile = fopen("op.txt", "wb"); 
    int len = strlen(filebuffer); 
    fwrite(filebuffer, len, 1, pfile); 
    fclose(pfile); 

    delete[] filebuffer; 
    return 0; 
} 
+3

您需要決定使用哪種語言。 'C'和'C++'是不同的語言。在我看來,你正在使用'C++',但你包括'C'庫。在'C++'代碼中,你應該爲'C++'verisons包含'',''和''。 – Galik

+4

Dude - 檢查所有I/O =「fseek()」,「fread()」等錯誤返回!一定要處理任何潛在的「新」分配失敗(或者使用C「malloc()」,並檢查NULL)。 – paulsm4

+2

嘗試以二進制(「rb」)模式打開文件。對於以字符模式打開的文件,ftell的結果不保證有意義。 –

回答

2

通過包括conio.h,我可以假設你在Windows上。在Windows中,您將在不使用二進制模式讀取的情況下遇到類似情況下的問題。我會嘗試以「rb」作爲模式打開文件。

FILE* pfile = NULL; 
pfile = fopen(fname, "rb"); 
+0

是的,我在Windows上,請讓我編輯我的帖子... – taansari

+0

你是對的,沒有使用「rb」模式似乎是我的情況下的問題...但是我也需要使用「wb」來將文件寫回磁盤 - 這解決了問題! – taansari

+0

非常好! :)我很高興我的答案適合你!不確定你的意思是接受下面的答案嗎? –