Как получить доступ к файловому указателю от одной функции к другой? - PullRequest
1 голос
/ 08 мая 2020

Я хочу сохранить данные в определенном месте, но всякий раз, когда я запускаю код, появляется сообщение о том, что 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;}

Ответы [ 2 ]

3 голосов
/ 08 мая 2020
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                                                                                                                     
0 голосов
/ 08 мая 2020
  1. Измените следующую строку

    int new_acc(char *name, size_t namesize);

на

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

Поскольку указатель на файл будет удобен - BTW - Возможно, выберите лучшее имя для переменной

Изменить

{new_acc(name, sizeof name);}

на

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

Так как это потребуется

Изменить

int new_acc(char *name, size_t namesize){

К

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

для соответствия выше и fp требуется в функции

Работа сделана!

...