2015-05-13 42 views
1

所以我有这样的代码传递给函数时文件指针的行为有所不同。为什么?

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

和输出是显而易见的。

​​

但文件指针不以相同的方式工作。我试图编写一个将数据附加到文件中的基本代码。

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,所以不应该像第一个程序中那样影响对方?

+0

'fputc','putc'和'rewind'改变指针指向的io对象。因此,指针是本地的并不重要。 –

+0

'fputc(ch,fp);'''getdata''应该是'fgetc(ch,fp)',对不对?顺便说一句,'ch'应该是'int'类型,而不是'char'。 –

+0

@CoolGuy问题是,我没有看到_prints_ __all__元素的声明。 –

回答

2

让我们看一下可能非常简化的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; } 

现在当你调用这些功能,很明显,他们修改底层对象。写完文件后,光标指向最后一个元素,因此fgetc将立即返回EOF,如果您不是rewind


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

+0

明白了。谢谢!! –

0

enter image description here任何打开文件的进程都有一个数据结构,用于存储与文件有关的查找位置等。无论您打开同一个文件多少次,它都是指向同一个DS的指针。打印这两个文件指针的值应该是相同的...因此,与访问该文件的File *无关。它们会影响对方的工作...

好的做法是,1 FP 1文件...如果您需要另一个关闭之前的

当打开的文件数为资源的过程。因此,这更多地涉及到工艺资源,然后当地

+0

yup +1。谢谢。 –

+0

你确定吗?我只是试着打开同一文件两次,从第一个'FILE'指针读取,然后从第二个读取。它从一开始就开始了。你有没有提到你的说法? –

+0

http://stackoverflow.com/a/17353503/3884862 – theadnangondal

0

其他答案解释它更技术上,所以我会保持简单。

首先了解以下

  • FP就像一个头指针。它在每次写操作读取时向前移动,以便下一次读取或写入文件将从前一操作结束时开始。
  • 由于它是一个指针,因此无论何时它被改变(在一个函数中或在主函数中),这些改变将被反射到任何地方。
  • 倒带设置FP到文件

所以在这个例子中,当你写入的文件使用的GetData,FP(或头)开始写每个字符后向前移动,即始终保持在文件的结尾。然后倒带完成,使其回到文件的头部。因此,当您再次打印时,阅读将从文件开头开始,而不是从文件结束开始。

现在,如果不倒带,那么fp将保留在文件末尾,printdata将不会打印任何东西。

相关问题