2013-04-03 7 views
0
if(command=="insert") 
{ 
    int i=0; 
    while(i>=0) 
    { 
     string textToSave[i]; 
     cout << "Enter the string you want saved: " << endl; 
     cin >>textToSave[i]; 

     ofstream saveFile ("Save.txt"); 
     saveFile << textToSave; 
     saveFile.close(); 
     i++; 
     break; 
    } 
} 

Я хочу сохранить массив, который я вставляю в .txt-файл. Но у меня проблема с созданием массива для хранения. Я также дилемму выбирать между whileloop и forloop, но думаю, что в то время как цикл более подходит, потому что неизвестно, сколько времени нужно вставлять в слова. Пожалуйста помоги. Благодарю.Строка для хранения массива

+0

Есть ли какой-то пользовательский ввод, который должен привести к остановке кода для запроса ввода? – simonc

+0

Да, сначала эта программа предложит запросить команду пользователя ввести, когда пользователь вводит «insert», и он будет запускать функцию выше. И он попросит пользователя вставить строку, и когда пользователь вводит ее, она будет храниться в строковом файле. Если пользователь хочет снова войти, необходимо снова ввести команду «Вставить». – user1088346

+0

@ user1088346: В этом случае, если вы читаете только одну строку для каждой команды «insert», вам вообще не нужен цикл. Вам нужен внешний цикл для чтения и обработки команд. –

ответ

0

Я думаю, что нужно что-то вроде кода ниже:

vector<string> textToSave(MAX); 

// ... 

ofstream saveFile ("Save.txt"); 

for(int i=0; i<textToSave.size(); i++) 
{ 
    cout << "Enter the string you want saved: " << endl; 
    cin >> textToSave[i]; 

    saveFile << textToSave[i] << endl; 
} 

saveFile.close(); 
0

Некоторые из наиболее очевидных проблем у вас есть являются:

  • Вы используете функцию C99 под названием variable-length array при объявлении textToSave. Это не законный C++.
  • Если в объявлении массива переменной длины работала бы, вы написали бы к одному за последний индекс при получении пользовательского ввода
  • Открываешь, и перезаписать, файл в каждой итерации.
  • Вы только петляете один раз, когда вы выходите из цикла, поэтому сохраняйте только одну строку.
  • Если вы не использовали break в конце цикла, вы должны навсегда зацикливаться на этом условии.
1

Вы пытаетесь сохранить весь массив строк, а не только текущий. Не уверен, зачем вам нужен i и иметь массив, хотя, так как вы просто читаете и записываете одну строку за раз, в любом случае.

Это может быть что-то вроде:

if(command=="insert") 
{ 
    string textToSave; 

    cout << "Enter the string you want saved: " << endl; 
    cin >>textToSave; 

    ofstream saveFile ("Save.txt"); 
    saveFile << textToSave; 
    saveFile.close(); 

    break; 
} 
+0

перезаписывать файл постоянно – 4pie0

+0

Привет, разматывайте, прежде чем я сделал то же самое с решением, которое вы предоставляете, и оно работает, но когда я вхожу в команду для отображения, он отображает только последнюю строку вставки. Пример: первая вставка i введите «abcd» вторую временную вставку i введите «qwer», но когда я отображу ее, отобразится только «qwer», но abcd исчез. Ниже приведена моя команда «display», вызвала ли моя проблема с командой дисплея? – user1088346

+0

if (команда == "display") { ifstream loadFile; loadFile.open ("Save.txt", ifstream :: in); cout << "Файл содержит:"; while (loadFile.good()) { cout << (char) loadFile.get(); } cout << "" << endl; loadFile.close(); } – user1088346

0

создать массив до того цикла, в противном случае вы постоянно создавать массивы размера увеличивается на 1. также изменить имя файла, если вы хотите, чтобы каждый будет сохранен в новом файле, в противном случае вы постоянно переписываете один и тот же файл.

string textToSave[string_count]; 
if(command=="insert") 
{ 
int i=0; 
    while(i<string_count) 
     { 
      cout << "Enter the string you want saved: " << endl; 
      cin >>textToSave[i]; 

      ofstream saveFile ("Save"+i+".txt"); 
      saveFile << textToSave[i]; 
      saveFile.close(); 
      i++; 
     } 
} 
+0

Вставка теперь выглядела нормально, но не удалось отобразить строковые данные, которые я хранил. Например, сначала вставить «Abcd» вторую вставку «qwer», она отображает только «qwer», но «Abcd» исчез. Не потому, что функция отображения была неправильной? if (команда == "display") { ifstream loadFile; loadFile.open ("Save.txt", ifstream :: in); cout << "Файл содержит:"; while (loadFile.good()) { cout << (char) loadFile.get(); } cout << "" << endl; loadFile.close(); } – user1088346

+0

@ user1088346 теперь у вас есть много файлов с одной строкой внутри (поэтому, если вы хотите напечатать ==, отобразите их все, что вам нужно загрузить все файлы и распечатать контент). это то, что вы хотели иметь? – 4pie0

+0

и, кроме того, у вас есть все содержимое всех файлов в вашем массиве textToSave, вы можете распечатать его – 4pie0

0

Но я возникли проблемы, чтобы создать массив для хранения.

Вне петли объявите пустой вектор; это будет держать массив:

vector<string> textToSave; 

Внутри цикла чтения строки и добавить его в массив:

string text; 
cin >> text; 
textToSave.push_back(text); 

или, чуть более компактно:

textToSave.push_back(string()); 
cin >> textToSave.back(); 

I а также дилемму для выбора между уклоном и шлюзом

Похоже, вы вообще не хотите петли, поскольку вы просто читаете одну строку.Вы, вероятно, хотите, чтобы внешний цикл считывал команды по линиям

vector<string> textToSave; 
for (;;) { // loop forever (until you reach "break") 
    string command; 
    cin >> command; 
    if (command == "quit") { // or whatever 
     break; 
    } 
    if (command == "insert") { 
     cout << "Enter the string you want saved: " << endl; 
     textToSave.push_back(string()); 
     cin >> textToSave.back(); 
    } 
    // other commands ... 
} 
Смежные вопросы