gpt4 book ai didi

C,读取文本文件时字符串中的垃圾/垃圾值

转载 作者:太空宇宙 更新时间:2023-11-04 04:18:43 25 4
gpt4 key购买 nike

我试图在 C 中读取一个 .txt 文件(paragraph.txt 作为输入),当我打印该字符串时,它的末尾有垃圾值,例如我的 Visual Studio 的路径或垃圾数据。除了一些异常(exception)情况,这种情况在 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);
}

我的文件大小函数只返回一个文件的字节数,我已经检查过它是正确的(返回 4412 字节,这是我拥有的确切字符数)。函数调用如下:

readfile(&buffer, input);

最佳答案

由于两个错误,它显示“垃圾”:

  1. 您没有为内容加上分配足够的内存'\0'-终止字节。
  2. 您没有设置 '\0' 终止字节。 fread 不会那样做,因为fread 不关心它正在读取的字节的含义,它只是读取一 block 内存,仅此而已。

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;
}

你还应该经常检查函数的返回码,特别是那些返回指针和/或写入您传递给它们的指针。如果其中之一函数返回一个错误,否则你将有未定义的行为。

编辑

在你说的评论里

I tried this by doing *buffer[bytes-1] = '\0'; but it just crashed the program when it tried to do this

那是因为 buffer[bytes-1]buffer + bytes -1 是一样的超出了 buffer 指向的范围。当您尝试取消引用它时使用*,它会崩溃。你需要做的(就像我在代码中所做的那样)是:(*buffer)[bytes] = 0;buffer[0][bytes] = 0 相同。

关于C,读取文本文件时字符串中的垃圾/垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48876841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com