如何从一个函数获得文件指针的访问权?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从一个函数获得文件指针的访问权?相关的知识,希望对你有一定的参考价值。

我想把数据存储在位置上,但每当我运行代码时,它给我的信息是 fp 是未申报的。我想 fp 在另一个函数中工作。如何做到这一点?

#include <stdio.h>
#include <stdlib.h>
#define MAX 15

int new_acc(char *name, size_t namesize);
int list_view(char *name);
int main(){
    FILE *fp;
    fp = fopen("/home/Documents/file.txt","w");      /* this is fp */

    int one='1', two='2';
    char choice[MAX], name[15] = "";
    do{
        printf("%c. Create new account\n",one);
        printf("Enter your choice: ");
        fgets(choice, sizeof choice, stdin);

        if (choice[0] == one)
            {new_acc(name, sizeof name);}
    }
    while(two != choice[0]);
    return 0;}

int new_acc(char *name, size_t namesize){
    printf("Enter your name: ");
    fgets(name, namesize, stdin);
    fputs(name, fp);
    fclose(fp);

    return 0;}
答案
int new_acc(char *name, size_t namesize)

改成。

int new_acc(FILE * fp, char *name, size_t namesize)

然后当你在main中调用这个函数时

new_acc(fp, name, sizeof name);

你应该检查这个函数的返回值 fopen:

fp = fopen("/home/Documents/file.txt","w"); 
if(!fp) {
  // handle the error.
}

你该走了 fclose(fp) 出这个功能。

OT,你应该把类型。

int one='1', two='2';

改成 char one='1', two='2'; 因为你把这些变量与 char 值。

针对评论中的问题进行了更新。

#include <stdio.h>
#include <stdlib.h>
#define MAX 15

int new_acc(FILE *fp, char *name, size_t namesize);

int main(){
    FILE *fp;
    fp = fopen("file.txt","w");      /* this is fp */
    if(!fp) {
        printf("cannot open the file");
        return -1;
    }

    char one='1', two='2';
    char choice[MAX], name[15] = "";
    char all_accouts[100][15];
    int i = 0;
    do{
        printf("%c. Create new account\n",one);
        printf("Enter your choice: ");
        fgets(choice, sizeof choice, stdin);

        if (choice[0] == one)
            {new_acc(fp, all_accouts[i], sizeof(all_accouts[i])); i++;}
    }
    while(two != choice[0]);

    for(int j = 0; j < i; j++) {
        printf("%s\n", all_accouts[j]);
    }
    fclose(fp);
    return 0;

}

int new_acc(FILE *fp, char *name, size_t namesize) {
    printf("Enter your name: ");
    fgets(name, namesize, stdin);
    fputs(name, fp);
    return 0;
}

测试的输出。

1. Create new account                                                                                                     
Enter your choice: 1                                                                                                      
Enter your name: name1                                                                                                    
1. Create new account                                                                                                     
Enter your choice: 1                                                                                                      
Enter your name: name2                                                                                                    
1. Create new account                                                                                                     
Enter your choice: 2                                                                                                      
name1                                                                                                                     

name2                                                                                                                     
另一答案
  1. 修改以下一行

    int new_acc(char *name, size_t namesize);

int new_acc(char *name, size_t namesize, FILE *fp);

因为文件指针会很方便--另外--也许为这个变量选择一个更好的名字吧

  1. 变化

    {new_acc(name, sizeof name);}

{new_acc(name, sizeof name, fp);}

由于这将是必要的

  1. 变化

    int new_acc(char *name, size_t namesize){

  int new_acc(char *name, size_t namesize, FILE *fp){

匹配上面和 fp 在函数中需要

工作完成了!在主函数之外定义它,它应该是一个全局变量。

另一答案

在主函数之外定义它,它应该是一个全局变量。

以上是关于如何从一个函数获得文件指针的访问权?的主要内容,如果未能解决你的问题,请参考以下文章

从 Viewpager2 片段访问父片段函数

QT如何获得对话框中控件的指针?

因为数据库正在使用,所以未能获得对数据库的排它访问权RESTORE DATABASE操作异常终止

如何防止从非常量访问指针中过滤指针向量的函数?

在使用ViewPager时尝试从其父活动修改片段时出现空指针异常

从片段内部访问 Toolbar/ActionBar 对象