c ++分配内存问题

时间:2010-02-08 12:52:47

标签: 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;
 }

4 个答案:

答案 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;

答案 1 :(得分:4)

为终止角色分配一个地方。并将它放在缓冲区的末尾。 这可能会解决您的问题。

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

答案 2 :(得分:0)

buffer必须包含一个以NULL结尾的字符串,才能使cout<<buffer输出有意义。

答案 3 :(得分:0)

当您使用 C ++ 时,使用 C ++ 说什么?

请参阅:http://www.cplusplus.com/doc/tutorial/files/

edit2:响应Neil(初始版本打印空行0):

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