讀取大文本文件後的垃圾我用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;
}
您需要決定使用哪種語言。 'C'和'C++'是不同的語言。在我看來,你正在使用'C++',但你包括'C'庫。在'C++'代碼中,你應該爲'C++'verisons包含'',''和''。 –
Galik
Dude - 檢查所有I/O =「fseek()」,「fread()」等錯誤返回!一定要處理任何潛在的「新」分配失敗(或者使用C「malloc()」,並檢查NULL)。 – paulsm4
嘗試以二進制(「rb」)模式打開文件。對於以字符模式打開的文件,ftell的結果不保證有意義。 –