2010-02-08 171 views
0

我有一個奇怪的問題,分配在c + +內存 我創建一個緩衝區並將文件內容讀入它。 問題是分配是不正確的,並在打印結束時有怪異的字符... 該文件的內容是「你好」... ... 我坐在它幾個小時...什麼可以是問題? :(C++分配內存問題

void main() 
{ 
FILE *fp; 
char *buffer; 
long file_size; 
size_t result; 

fp = fopen("input.txt","r"); 
if (fp == NULL) { fputs("File Error",stderr); exit(1); } 

//get file size 
fseek(fp, 0, SEEK_END); 
file_size = ftell(fp); 
rewind(fp); 

//allocate memory to contain the whole file size 
buffer = new char[file_size]; 

if (buffer == NULL) { fputs("Cannot allocate memory space",stderr); exit(2); } 

//copy the file into the buffer 
result = fread(buffer, 1, file_size, fp); 
if (result != file_size) { fputs("Reading error",stderr); exit(3); } 

cout<<buffer; 
fclose(fp); 
delete buffer; 
} 
+1

一個備註:緩衝器是一個數組。您應該使用「delete []緩衝區」將其刪除。 – 2010-02-08 12:56:52

+2

您正在使用C和C++功能的奇怪組合。我真的推薦你使用「純粹的C++」方法:class ifstream用於文件輸入,class string用於存儲文本。另外,不需要從main調用exit:只需使用「return EXIT_CODE」; – Manuel 2010-02-08 13:16:55

+2

另外,在C++中main()應該總是返回「int」。因此,最小的有效C++程序正好是_int main(){} _(return可以省略,但應該只在沒有錯誤的情況下) – 2010-02-08 13:24:42

回答

4

爲終止字符分配一個位置並將其放在緩衝區的末尾 這可能會解決您的問題。

buffer = new char[file_size + 1]; 
buffer[file_size] ='\0'; 
5

你是不是零終止您的緩衝區,所以它不是一個有效的C/C++字符串

嘗試以下變化:

//allocate memory to contain the whole file size, plus one char for termination 
buffer = new char[file_size + 1]; 

if (buffer == NULL) { fputs("Cannot allocate memory space",stderr); exit(2); } 

//copy the file into the buffer 
result = fread(buffer, 1, file_size, fp); 
if (result != file_size) { fputs("Reading error",stderr); exit(3); } 

// terminate buffer, so it becomes a valid string we can print 

buffer[file_size] = '\0';  
cout<<buffer; 
+0

非常感謝! – kaycee 2010-02-08 13:16:32

0

buffer必須包含終止的NULL字符串爲cout<<buffer輸出有意義

0

當你在C++,有什麼講反對使用C++

見:http://www.cplusplus.com/doc/tutorial/files/

EDIT2:響應於尼爾(初始版本打印的空行0):

int main() { 
     std::ifstream i ("main.cpp"); 
     std::string str; 
     for (int line=0; getline (i, str); ++line) { 
       std::cout << line << ':' << str << '\n'; 
     } 
} 
+1

如果您建議使用C++,那麼發佈有效的代碼可能是一個好主意。想象一下,如果文件是空的,會發生什麼。您不應該使用eof(),而應該將讀取循環放在getline()的返回值上。 – 2010-02-08 13:12:07

+1

@Neil Butterworth:至少沒有什麼不好的事情發生,只有0個字符被讀取。但我會添加一個更好的版本。 – 2010-02-08 13:22:03

+1

它打印一個不存在的空行。而且你也不需要很好()。 – 2010-02-08 13:37:32