【发布时间】:2023-04-01 03:05:02
【问题描述】:
来自这个帖子https://stackoverflow.com/a/22059317/5859944
FILE *fileptr;
char *buffer;
long filelen;
fileptr = fopen("myfile.txt", "rb"); // Open the file in binary mode
fseek(fileptr, 0, SEEK_END); // Jump to the end of the file
filelen = ftell(fileptr); // Get the current byte offset
in the file
rewind(fileptr); // Jump back to the beginning of
the file
buffer = (char *)malloc((filelen+1)*sizeof(char)); // Enough memory
for file + \0
fread(buffer, filelen, 1, fileptr); // Read in the entire file
fclose(fileptr); // Close the file
您将文件作为字节数组读取。
很明显,它只是一个字符串。 可以添加一个
buffer[filelen] = '\0';
和
printf("%s" , buffer);
应该像字符串一样打印文件的全部内容。它在简单的文本文件中这样做,但不是在二进制文件中。
对于二进制文件,必须编写如下函数:
void traverse(char *string ,size_t size){
for(size_t i=0;i<size;i++)
printf("%c",string[i]);
}
并一个一个地打印每个字符。 这会使屏幕上出现乱码。
- 为什么
printf不将buffer视为二进制文件的字符串? - 为什么
printf在函数traverse中使用乱码而不是字符?
对于第二个要点,我知道这可能是由于signed char,但即使字符串存储为unsigned char,结果仍然相同。
【问题讨论】:
-
二进制文件通常包含零。那是
\0字符。 -
读取文本文件作为二进制文件将使您的函数正确打印
-
字符串以空值结尾。如果字符串中有一个 0 字节,那么就 printf 而言,这是字符串的结尾。并非所有字符都是可打印的,所以如果您的文件包含这些字符,那么您就会得到乱码。
-
您想打印数值吗?然后看到这个:stackoverflow.com/questions/15736497/… 看起来你的问题与你真正的问题完全无关。
-
试试
printf("%c",string[i]);-->printf(" %hhu",string[i]);
标签: c printf file-handling