Я пытаюсь сделать простой файловый браузер на 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();
}
}
Кажется, вы совершаете распространенную ошибку — не просматриваете окончания строк при чтении пользовательского ввода.
Если пользователь вводит 1
что на самом деле во входном буфере 1\n
(они должны были нажать Enter, верно?) и вы звоните getchar
чтобы получить 1
поэтому буфер теперь содержит \n
, Затем, когда вы звоните getline
чтобы получить путь, он будет читать до первой новой строки. Таким образом, он получает пустую строку.
После вашего getchar
ты должен позвонить ignore
пропустить перевод строки.
Других решений пока нет …