我在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;
}
答案 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';
}
}