我输入用户名以存储到文件时出现问题,但它不会存储

问题描述 投票:0回答:1
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

void tampilan_awal()
{
    int angka_daerah;
    do {
    printf("Daerah\n.....................................\n1. Daerah\n");
    printf("Ketik angka 1 jika ingin memilih daerah yang dituju dan angka 0 jika tidak ingin melanjutkan!\n"); //Click 1 if you wanna choose destination(daerah) you wanna go and click 0 if you don't want to continue
    scanf("%i", &angka_daerah);
    if(angka_daerah == 1)
    {
        pilihdaerahutama();
    } else if(angka_daerah == 0)
    {
        break;
    }
    } while (angka_daerah != 1 && angka_daerah != 0);
}

void daftar_akun_database() {
    FILE *filePointer;
    char username[30];
    char password[30];

    // Buka file untuk menulis
    filePointer = fopen("filename.txt", "a");

    printf("Buat username dan password\n");

    printf("Username: ");
    fgets(username, sizeof(username), stdin);
    clearBuffer();

    printf("Password: ");
    fgets(password, sizeof(password), stdin);
    clearBuffer();

    // Menghapus karakter newline dari username dan password
    strtok(username, "\n");
    strtok(password, "\n");

    fprintf(filePointer, "Username: %s\nPassword: %s\n", username, password);

    fclose(filePointer);

    filePointer = fopen("filename.txt", "r");
    fseek(filePointer, 0, SEEK_SET);

    check_database();
}


void clearBuffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

void check_database() {
    FILE *filePointer;
    char username[50];
    char line[50];
    char password[50];
    bool found = false;
    int punya_akun;

    // Buka file untuk membaca
    filePointer = fopen("filename.txt", "r");

    // Periksa keberhasilan pembukaan file
    if (filePointer == NULL) {
        printf("Gagal membuka file.\n");
        return 1;
    }

    // Meminta pengguna untuk memasukkan username dan password
    printf("Masukkan username dan password\n");
    printf("Masukkan username: ");
    fgets(username, sizeof(username), stdin);
    clearBuffer();
    strtok(username, "\n"); // Menghapus newline

    printf("Masukkan password: ");
    fgets(password, sizeof(password), stdin);
    clearBuffer();
    strtok(password, "\n"); // Menghapus newline

    // Loop untuk membaca setiap baris dari file
        while (fgets(line, sizeof(line), filePointer) != NULL) {
        // Menghapus karakter newline dari setiap baris
            strtok(line, "\n");

        // Memeriksa apakah username dan password ada dalam baris
            if (strstr(line, "Username: ") != NULL && strstr(line, username) != NULL &&
                fgets(line, sizeof(line), filePointer) != NULL && // Membaca baris Password
                strstr(line, "Password: ") != NULL && strstr(line, password) != NULL) {
                printf("Username dan password benar!\n");
                found = true;
                tampilan_awal();

        }
    }
    if(!found)
    {
        printf("Username tidak dapat ditemukan silahkan coba lagi.\n");
        do{
        printf("Sudah punya akun? Silahkan ketik 1 untuk daftar dan 2 untuk coba lagi: ");
        scanf("%i", &punya_akun);
        if(punya_akun == 1)
        {
            daftar_akun_database();
        } else{
            check_database();
        }
        } while(punya_akun != 1 && punya_akun != 2);
    }
  

    fclose(filePointer);

}

int main()
{
    check_database();
    return 0;
}

我不知道我的代码出了什么问题:(,讲师没有正确地教授 f gets 和 gets 函数,他们做得太仓促了。他们推荐我使用 gets,而我只知道 f gets 因为我在w3schools学习。有人可以给我正确的代码以及我做错的地方吗?我很无能,截止日期是明天(我们必须在网上提交)

我尝试输入用户名和密码,但文件上根本没有用户名。像这样 用户名: 密码:1234

我认为这与 fgets 和函数clearBuffer 有关,但我不知道哪里出了问题。函数clearBuffer刚刚创建了一些新空间,就像我们转到check_database函数一样,它显示如下 用户名:1234(输入) (进入) 密码:5678(输入) (输入)

我不明白发生了什么,有人可以向我解释一下吗???

c function fgets
1个回答
0
投票

check_database()
中,您读取了带有
fgets()
的行,该行消耗了尾随的
\n
。然后你调用
clearBuffer()
,它将阻塞
getchar()
直到使用 Ctrl-D 关闭流以生成 EOF,因为流中没有留下
\n
。使用
clearBuffer()
读取字符串后不要调用
fgets()

strtok(username, "\n")
没有做任何事情。去除尾随换行符的一种方法是:

username[strcspn(username, "\n")] = '\0';
© www.soinside.com 2019 - 2024. All rights reserved.