gpt4 book ai didi

c - 文件指针在传递给函数时表现不同。为什么?

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:42 24 4
gpt4 key购买 nike

所以我有这个代码

void getdata(int *q)
{
for(int i=0;i<3;++i)
scanf("%d",q++);
*q=10;
}

int main()
{
int *p,a[4];
p=a;
getdata(p);
printf("%d",*p);
return 0;
}

而且输出很明显。

7
8
9
7

但是文件指针的工作方式不同。我正在尝试编写用于将数据附加到文件中的基本代码。

void getdata(FILE *fp)
{
char ch;
while((ch=getchar())!=EOF)
fputc(ch,fp);
rewind(fp);
}

void printdata(FILE *fp)
{
char ch;
while((ch=fgetc(fp))!=EOF)
putc(ch,stdout);
}
int main()
{
FILE *fp1;
fp1=fopen("music.txt","w+");
getdata(fp1);
printf("Text is::\n");
printdata(fp1);
fp1=fopen("music.txt","a+");
printf("\nEnter some more text::\n");
getdata(fp1);
printf("\nAfter appending text is::\n");
printdata(fp1);
return 0;
}

这段代码工作正常。但是,如果 rewind(fp); 被删除,它就会表现得很奇怪。为什么我需要倒回指针?虽然指向同一个文件的 fp1fp 不是函数的局部变量,因此应该不会像第一个程序那样相互影响?

最佳答案

让我们看一下 FILE 结构的一个可能的非常简化的实现。出于示例的目的,假设 content 指向映射到磁盘上文件的内存。

typedef struct FILE {
size_t size;
size_t cursor;
uint8_t *content;
} FILE;

int fputc(FILE *f, char c) { size++; return f->content[f->cursor++] = c; }
int fgetc(FILE *f) { return (f->cursor == f->size) ? EOF : f->content[f->cursor++]; }
void rewind(FILE *f) { f->cursor = 0; }

现在当您调用这些函数时,很明显它们修改了底层对象。当您完成文件写入后,光标指向最后一个元素,因此如果您不rewindfgetc 将立即返回 EOF。


澄清一下,当您调用 fopen 时,您会创建一个存储在某处的单个 FILE 对象。你无法控制这个对象,你只是得到一个指向它的指针。如果更容易理解,您可以将此指针(在您的示例中为 fp1)视为文件 ID。任何更改都是在 FILE 对象上完成的,而不是指针/ID 本身。

关于c - 文件指针在传递给函数时表现不同。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30213308/

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