如果我使用 2 作为输入,代码将不会继续

问题描述 投票:0回答:1

如果我为 std::cin >> menu; 输入数字 2,则 std::cin >> menu; 之后的代码不会执行。 起初,我认为问题出在函数中,但代码甚至没有转到开关(我已在开关中使用 std::cout 和 std::cin >> menu; 之后对其进行调试)。

我输入2后,就卡在那里,就像加载一些大型进程一样,而我所做的只是将菜单作为开关参数。

我的代码有什么问题有人可以帮忙吗?

#include <iostream>
#include <fstream>
#include <unistd.h>

struct jadwal {
    std::string Jurusan;
    int Jam;
    int Durasi;
};

void daftarMenu() {
    std::cout << "aplikasi pertemuan" << std::endl;
    std::cout << "menu : " << std::endl;
    std::cout << "[1]. Input" << std::endl;
    std::cout << "[2]. Output" << std::endl;
    std::cout << "[3]. Hasil" << std::endl;
    std::cout << "[4]. Exit" << std::endl;
}

void inputJadwal() {
    int jumlah;
    jadwal jadwal[100];
    std::cout << "Masukkan jumlah jadwal yang ingin ditambahkan : ";
    std::cin >> jumlah;

    std::ofstream file;
    file.open("file1.txt", std::ios::app);
    if(!file) {
        file.open("file1.txt", std::ios::trunc);
    };

    for(int i = 0; i < jumlah; i++) {
        std::cin.ignore();
        std::cout << "Jurusan : ";
        getline(std::cin, jadwal[i].Jurusan);
        file << jadwal[i].Jurusan;

        file << std::endl;

        std::cout << "Jam : ";
        std::cin >> jadwal[i].Jam;
        file << jadwal[i].Jam;

        file << std::endl;

        std::cout << "Durasi : ";
        std::cin >> jadwal[i].Durasi;
        file << jadwal[i].Durasi;

        file << std::endl;
    };

    file.close();

    std::cout << "Data berhasil di input, mengembalikan ke menu utama..." << std::endl;
    sleep(2);
};

void outputJadwal() { 
    jadwal jadwal[100];
    std::ifstream file;
    file.open("file1.txt");
    std::cout << "tes";
    if(!file) {
        std::cout << "Tidak ada jadwal terdaftar" << std::endl;
        sleep(2);
        return;
    };

    std::cout << "tes";
    int index = 0;
    while(!file.eof()) {
        file >> jadwal[index].Jurusan;
        file >> jadwal[index].Jam;
        file >> jadwal[index].Durasi;
        index++;
    }

    int total = index + 1;

    for(int i = 0; i < total; i++) {
        std::cout << "Jurusan : " << jadwal[i].Jurusan;
        std::cout << "Jam " << jadwal[i].Jam;
        std::cout << "Durasi " << jadwal[i].Durasi;
    }

    file.close();
};

void hasilJadwal() {

};

int main() {
    int menu;
    int jumlah;
    
    do{
        //
        daftarMenu();
        std::cout << "Pilih : ";
        std::cin >> menu;
        
        // this code won't execute if i enter number 2 for the menu, but it is okay if i enter 1, 3, 4, 5, or more
        std::cout << "you are choosing menu " << menu;

        switch(menu) {
            case 1:
                inputJadwal();
                break;
            case 2:
                std::cout << "case 2 selected";
                outputJadwal();
                break;
            case 3:
                hasilJadwal();
                break;
            case 4:
                std::cout << "Mengeliminasi program...";
                return 0;
            default:
                std::cout << "Input tidak valid, mengembalikan ke menu utama..." << std::endl;
                sleep(2);
                break;
        }

    }while(true);
    return 0;
}

我已经尝试过 Chat GPT 中的这个解决方案,但它没有任何作用。

if(std::cin.fail()) {
            std::cerr << "Error: Invalid input. Clearing input buffer and retrying..." << std::endl;
            std::cin.clear(); // Clear the error flags
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Discard invalid input
            sleep(2);
            continue; // Retry the loop
        }

        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

我个人不认为我的代码有任何问题,至少在 int main() 中,因为我的问题只在 int main();

c++ input c++14
1个回答
0
投票

嗯,我已经很久没有编写 C++ 程序了,但我确实看过代码。

正如所提供的那样,它根本无法编译。首先,函数 sleep() 应该以大写 S 开头,并且缺少“windows.h”标头,这样它才能工作。您还缺少 getline() 工作的“字符串”标头。

#包括 #包括

睡眠(int);

进行这些更改后,程序编译良好,创建了文件,并且我可以通过选择选项 2 来读取它。

不确定为什么它在您的特定情况下不起作用,但这可能与文件或创建该文件的文件夹的读取权限有关。

此外,您确实必须用 try catch 块包围所有这些逻辑(至少在 main 中)。如果出现任何异常,您可以选择将其打印到控制台并了解可能发生的情况。

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.