-1

C++ で基本的なファイル ブラウザを作成しようとしていますが、うまく機能しません。説明が非常に難しいため、何が起こっているかを示すために画像を下部に配置しました。

#include <iostream>
#include <sstream>
#include <fstream>

#define NULL(str) (str == "")

using namespace std;

void read(string *memory);
void write(string *memory);

int main(void){
    string memory;
    for(;;){
        cout << "Please select your option:" << endl << "1: read a file - this text will be stored in memory until another file is read" << endl << "2: write text to a file - use ~MEM to get memory" << endl;
        char opt = getchar();
        switch(opt){
        case '1':
            read(&memory);
            break;
        case '2':
            write(&memory);
            break;
        default:
            cout << "The option was unrecongized" << endl << endl;
            break;
        }
    }
    return 0;
}

void read(string *memory){
    string path;
    cout << "Please enter the path of the file you would like to read" << endl;
    getline(cin, path);
    string str;
    string input;
    ifstream file;
    file.open(path);
    if(!file.is_open() || !file.good()){
        cout << "An error occured while reading the file" << endl << endl;
    }
    else{
        while(getline(file, str)){
            input += str;
        }
        file.close();
        if(NULL(input)){
            cout << "The input from the file is empty" << endl << endl;
        }
        else if(input.size() > 1000){
            cout << "The file is too large: it is bigger than 1000 characters" << endl << endl;
        }
        else{
            *memory = input;
            cout << input << endl << endl;
        }
    }
}

void write(string *memory){
    string path;
    cout << "Please enter the path of the file you would like to write to" << endl;
    getline(cin, path);
    ofstream file;
    file.open(path);
    if(!file.is_open() || !file.good()){
        cout << "The file could not be written to" << endl << endl;
    }
    else{
        string input;
        getline(cin, input);
        if(input == "~MEM"){
            file << *memory;
        }
        else{
            file << input;
        }
        file.close();
    }
}

私の問題

4

1 に答える 1

2

ユーザー入力を読み取るときに行末を監視しないというよくある間違いを犯しているようです。

ユーザーが1実際に入力バッファーにあるものを入力すると1\n(Enter キーを押す必要がありましたよね?)、 を呼び出しgetcharて を取得する1ため、バッファーには が含まれるようになります\n。次に、パスを取得するために呼び出すgetlineと、最初の改行まで読み取られます。したがって、空の文字列が取得されます。

その後、改行をスキップするようにgetchar呼び出す必要があります。ignore

于 2013-12-09T17:16:23.133 に答える