gpt4 book ai didi

c - 如何使用 fread() 将文件内容加载到 C 字符串数组的第二个元素中?

转载 作者:行者123 更新时间:2023-11-30 19:48:51 26 4
gpt4 key购买 nike

我在理解指针在特定情况下如何工作时遇到一些困难。下面概述了我的困惑的详细信息。

我创建了一个名为 buffer 的 8 字节字符串字符数组,并且尝试使用 fread() 将文件中的 8 个字节加载到该 8 字节字符串数组的元素之一中。

位于/c/file.txt 的文件内容很简单:TESTTEST

我希望程序将 TESTTEST 加载到 buffer[1] 而不是值 ijklmnop,仅此而已。

我知道 buffer 实际上是一个指针数组,在本例中只是三个连续的内存地址,其中包含三个连续字节数组的第一个元素的地址,这些数组不是以 null 结尾的。

我将其想象为一行中的 24 个内存地址,其中包含 ABCDEFGHijklmnopQRSTUVWX 的二进制值,末尾没有\0。

buffer[0]的地址指向A的地址,buffer[1]的地址指向i的地址,buffer[2]的地址指向Q的地址.

我看到 &buffer[1] 的 fread() 将 8 个字节读取到 buffer[1] 中存储的地址位置。

我已经尝试使用 &buffer+1、buffer+1、(buffer+1) 等对此 fread() 进行了各种尝试,但大多数都给了我段错误; &buffer[1] 似乎几乎满足了我的要求。

尝试执行 printf("buffer[1] as %%s is %s\n", buffer[1]);在 fclose() 之前接近尾声时,出现段错误。

我即将达成理解,但有些事情不太正确,而且我没有掌握一些我需要的基本概念。

我不确定终止 (buffer+1)[8] 是否溢出到 buffer[2] 的首地址或产生什么影响。

总的来说,我只是有点困惑,任何帮助将不胜感激。

谢谢!

这是我的整个程序:

#include <stdio.h>
#include <string.h>

int main()
{
FILE *fp;
char c[] = "OFFONOFF";
char *buffer[] = {"ABCDEFGH", "ijklmnop", "QRSTUVWX"};
char *t;

printf("the value in file /c/file.txt is TESTTEST, only those 8 bytes\n");
printf("the ls listing for /c/file.txt shows 9, I am not sure where the other character comes from\n");

printf("the value as %%s of buffer[0] is %s\n", buffer[0]);
printf("the value as %%s of buffer[1] is %s\n", buffer[1]);
printf("the value as %%s of buffer[2] is %s\n", buffer[2]);
printf("the sizeof(buffer[2]) is %d\n", sizeof(buffer[2]));

fp = fopen("/c/file.txt", "r");
fseek(fp, SEEK_SET, 0);

printf("the value as %%c of buffer[1][3] is %c\n", buffer[1][3]);
printf("the memory address as %%p for buffer+1 is %p\n", buffer+1);

fread(&buffer[1], strlen(c), 1, fp);

/* I am attempting to terminate the fread into &buffer[1] with a \0, removing this doesn't change much */
(buffer+1)[8] = "\0";

printf("the memory addreses below are all in %%p format\n");
printf("the memory address of buffer is %p\n", buffer);
printf("memory address of buffer[1] is %p\n", buffer[1]);
printf("memory address of &buffer is %p\n", &buffer);
printf("memory address of &buffer+1 is %p\n", &buffer+1);
printf("memory address of &buffer[1] is %p\n", &buffer[1]);
printf("memory address of buffer is %p\n", buffer);
printf("memory address of buffer[15] is %p\n", buffer[15]);
printf("memory address of buffer+15 is %p\n", buffer+15);
printf("memory address of *(buffer+1) is %p\n", *(buffer+1));
printf("the sizeof(buffer[0]) is %d\n", sizeof(buffer[0]));
printf("the sizeof(*(buffer+1)) is %d\n", sizeof(*(buffer+1)));
printf("the sizeof(buffer) is %d\n", sizeof(buffer));
printf("the value of *(buffer+0) as %%s is %s\n", *(buffer+0));
printf("the value of *buffer, the first element of the array of strings, as %%s is %s\n", *buffer);
printf("the value of buffer+1, the first element of the array of strings, as %%s is %s\n", buffer+1);
printf("buffer[0] as %%s is %s\n", buffer[0]);
printf("buffer+1 as %%s is %s\n", buffer+1);
printf("buffer[2] as %%s is %s\n", buffer[2]);
printf("buffer is %s\n", buffer+1);
printf("sizeof(*buffer) is %d\n", sizeof(*buffer));

fclose(fp);

return(0);
}

这是确切的输出:

the value in file /c/file.txt is TESTTEST, only those 8 bytes
the ls listing for /c/file.txt shows 9, I am not sure where the other character comes from
the value as %s of buffer[0] is ABCDEFGH
the value as %s of buffer[1] is ijklmnop
the value as %s of buffer[2] is QRSTUVWX
the sizeof(buffer[2]) is 8
the value as %c of buffer[1][3] is l
the memory address as %p for buffer+1 is 0x7ffff7b23a28
the memory addreses below are all in %p format
the memory address of buffer is 0x7ffff7b23a20
memory address of buffer[1] is 0x5453455454534554
memory address of &buffer is 0x7ffff7b23a20
memory address of &buffer+1 is 0x7ffff7b23a38
memory address of &buffer[1] is 0x7ffff7b23a28
memory address of buffer is 0x7ffff7b23a20
memory address of buffer[15] is 0x400674
memory address of buffer+15 is 0x7ffff7b23a98
memory address of *(buffer+1) is 0x5453455454534554
the sizeof(buffer[0]) is 8
the sizeof(*(buffer+1)) is 8
the sizeof(buffer) is 24
the value of *(buffer+0) as %s is ABCDEFGH
the value of *buffer, the first element of the array of strings, as %s is ABCDEFGH
the value of buffer+1, the first element of the array of strings, as %s is TESTTEST

@
buffer[0] as %s is ABCDEFGH
buffer+1 as %s is TESTTEST

@
buffer[2] as %s is QRSTUVWX
buffer is TESTTEST

@

最佳答案

fread(&buffer[1], strlen(c), 1, fp); 似乎覆盖了指针本身。

看来您想要的是一个二维数组,而不是指向字符串文字的指针数组(顺便说一下,字符串文字在大多数现代平台上都是只读的: char *abc="abc"; abc [0]='d' 通常是段错误):

char buffer[][9] = {"ABCDEFGH", "ijklmnop", "QRSTUVWX"};

关于c - 如何使用 fread() 将文件内容加载到 C 字符串数组的第二个元素中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16585439/

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