gpt4 book ai didi

c - 使用 fread() 将文本文件读入缓冲区 - 为什么缓冲区中的值不是每个字符各自的 ASCII 值?

转载 作者:太空狗 更新时间:2023-10-29 14:55:05 26 4
gpt4 key购买 nike

首先,这不是家庭作业。只是想了解为什么我会看到我在屏幕上看到的内容。

下面的内容(我自己的作品)目前接受一个输入文件并将其作为二进制文件读取。我希望它将读取的每个字节存储在一个数组中(供以后使用)。为了简洁起见,输入文件 (Hello.txt) 仅包含“Hello World”,没有撇号。

int main(int argc, char *argv[]) {

FILE *input;
int i, size;
int *array;

input = fopen("Hello.txt", "rb");
if (input == NULL) {
perror("Invalid file specified.");
exit(-1);
}

fseek(input, 0, SEEK_END);
size = ftell(input);
fseek(input, 0, SEEK_SET);

array = (int*) malloc(size * sizeof(int));
if (array == NULL) {
perror("Could not allocate array.");
exit(-1);
}
else {
input = fopen("Hello.txt", "rb");
fread(array, sizeof(int), size, input);
// some check on return value of fread?
fclose(input);
}

for (i = 0; i < size; i++) {
printf("array[%d] == %d\n", i, array[i]);
}

为什么像上面那样在 for 循环中使用 print 语句会导致输出看起来像这样

array[0] == 1819043144
array[1] == 1867980911
array[2] == 6581362
array[3] == 0
array[4] == 0
array[5] == 0
array[6] == 0
array[7] == 0
array[8] == 0
array[9] == 0
array[10] == 0

在这样的情况下

printf("array[%d] == %d\n", i, ((char *)array)[i]);

使输出看起来像这样(每个字符的十进制 ASCII 值)

array[0] == 72
array[1] == 101
array[2] == 108
array[3] == 108
array[4] == 111
array[5] == 32
array[6] == 87
array[7] == 111
array[8] == 114
array[9] == 108
array[10] == 100

?如果我将它作为二进制文件读取并想逐字节读取,为什么我不能使用第一个 print 语句获得正确的 ASCII 值?

相关说明,如果我发送的输入文件不是文本文档(例如 jpeg)会怎样?

抱歉,这完全是一件微不足道的事情,但我似乎无法弄清楚为什么

最佳答案

行为并不奇怪:

  • 您有一个包含 11 个字符的文件。 sizeof(char)是 1。
  • 现在你分配了一个 int 的数组与 11 int。 sizeof(int)在你的机器上很可能是4
  • 您指导 fread最多阅读 11 int s(最多 44 个字节)。所以前 4 个字符将被读取为 int并存储在 array[0]和接下来的 4 个 array[1] .
    • 如果您检查了 return of fread 它会告诉你它实际上只读取了 2 个元素(因为内容是 11 个字节,它只能读取 2 个 int s,最后 3 个剩余字节不能作为 int 成功读取)。
  • 现在遍历数组并打印出 int 的数字您可以通过前 4 个字符建立起来。
  • 在您的替代解决方案中,您假装指向一个字符序列,因此数组索引只会增加 1 个字节的偏移量

内存布局基本上是这样的:

array[0]
| array[1]
| |
1 2 3 4 5 6 7 8 9 10 11
| |
| ((char *)array)[1]
((char *)array)[0]

关于c - 使用 fread() 将文本文件读入缓冲区 - 为什么缓冲区中的值不是每个字符各自的 ASCII 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18972879/

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