我正在尝试在C中读取.txt文件(paragraph.txt作为输入),当我打印字符串时,它的末尾有垃圾值,例如我的visual studio路径或垃圾数据。这种情况在99%的情况下发生,但有一些例外。我不知道为什么会这样做?
void readfile(char **buffer, char *input)
{
FILE *file = fopen(input, "r");
int bytes = filesize(file);
*buffer = (char*)malloc(bytes);
fread(*buffer, bytes, 1, file);
printf("%s\n", *buffer);
fclose(file);
}
我的filesize函数只返回一个文件的字节数,我检查过它并且它是正确的(返回4412个字节,这是我拥有的确切字符数)。 函数被称为:
readfile(&buffer, input);
答案 0 :(得分:0)
因为两个错误而显示“垃圾”:
'\0'
- 终止字节。'\0'
- 终止字节。 fread
不会这样做,因为
fread
并不关心它正在读取的字节的含义,它只是读取
一块记忆,就是这样。
int readfile(char **buffer, const char *input)
{
if(buffer == NULL)
return 0;
FILE *file = fopen(input, "r");
if(file == NULL)
{
fprintf(stderr, "could not open %s for reading: %s\n", input,
strerror(errno));
return 0;
}
int bytes = filesize(file);
*buffer = malloc(bytes + 1);
if(*buffer == NULL)
{
fprintf(stderr, "Not enough memory\n");
fclose(file);
return 0;
}
if(fread(*buffer, bytes, 1, file) != 1)
{
fprintf(stderr, "could not read\n");
free(*buffer);
*buffer = NULL;
fclose(file);
return 0;
}
(*buffer)[bytes] = 0; // setting the 0 byte
puts(*buffer);
fclose(file);
return 1;
}
您还应该始终检查函数的返回码,特别是那些 返回指针和/或写入传递它们的指针。如果其中之一 函数返回错误,否则你会有未定义的行为。
修改强>
你说的评论中的
我通过执行
*buffer[bytes-1] = '\0';
尝试了这个,但它在尝试执行此操作时崩溃了该程序
那是因为buffer[bytes-1]
与buffer + bytes -1
相同
超出buffer
指向的范围。当你试图取消引用它
与*
一起,它会崩溃。你需要做的(就像我在代码中所做的那样)是:
(*buffer)[bytes] = 0;
与buffer[0][bytes] = 0
相同。