2013-05-02 3 views
-1

Я только что начал C++ сегодня, и я просмотрел множество каналов по этой теме. Во время поиска я нашел функцию с именем ignore, которая несколько помогла. Моя первоначальная проблема заключалась в том, что при запуске пропускался ввод. Я обнаружил, что это, вероятно, связано с тем, что \ n все еще находится в буфере, поэтому я использовал функцию cin.ignore(), чтобы очистить ее. Тем не менее, я все еще не получаю желаемого результата. Вот мой код:Не получать желаемый результат для cin.getline(),

{

time_t current; 

    char event[30]; 
    char details[256]; 

    char outFileName[21]; 
    cout<< "Enter name of file to hold the input.[20 Character Max]: "; 
    cin>>outFileName; 

    ofstream outFile(outFileName); 

    cout<< "Event: "; 
    cin.getline(event, 30, '\n'); 
    cin.ignore(); 
    outFile<< event<< '\n'; 

    cout<< "Details: "; 
    cin.getline(details, 256, '\n'); 
    cin.ignore(); 
    outFile<< details<< '\n'; 

    current = time(NULL); 
    outFile<< ctime(&current); 

}

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

+2

Если вы буквально только начали C++ сегодня, то слишком рано публиковать сообщения о переполнении стека. Есть тысячи дубликатов этой проблемы здесь на SO, и вы должны потратить неделю или три, просто * чтение * других сообщений ... –

+0

Это не 'getline', оставляющий новую строку, это' cin >> '. Я настоятельно рекомендую вам начать использовать 'std :: string', и я ожидаю, что смогу ввести имя файла, содержащее пробелы. – chris

ответ

0

Поместите cin.ignore сразу после ввода имени файла. Возвращение каретки с cin>>outFileName; поглощается следующим cin.

Также я не уверен, что игнорировать - это правильная команда для использования здесь. Если это не работает, попробуйте cin.clear() или cin.sync(). Возьмите это с солью, поскольку я все еще изучаю C++.

+0

Я очень ценю помощь. Я собираюсь попробовать это прямо сейчас. – Beetle

+0

Добавление cin.ignore() после работы. БЛАГОДАРЯ! – Beetle

0

Я очень смущен. Вы пытаетесь прочитать из файла, а затем записать в файл?

EDIT: Думаю, я понял, что вы пытаетесь сделать. Вы можете игнорировать ниже.

Вы ничего читаете из файла. cin.getline получает вход с клавиатуры. Вы хотите создать экземпляр файлового объекта, который читает и записывает в файл.

//Create a file that reads AND writes 
std::fstream readAndWrite(outFile, std::ios::in | std::ios::out); 

Примечание ostream, не ofstream (т.е. ifstream для чтения, ofstream для написания fstream для обоих)

//Check to see if the file opened 
if(readAndWrite.is_open()) 
{ 
    cout<< "Event: "; 
    readAndWrite.getline(event, 30, '\n'); 
    readAndWrite << event << '\n'; 

    //Same for the rest of your code 

    //Close file 
    readAndWrite.close(); 
} 
else 
    std::cout << "\nFile did not open! " << std::endl; 
0

Давайте представим себе следующий ввод данных пользователем:

Enter name of file to hold the input.[20 Character Max]: foo 
Event: something 
Details: blah blah 
  1. Прежде всего, cin>>outFileName будет извлекать характер rs от cin до пробела. Первым символом пробела после foo является номер \n. Это \n - это , а не, извлеченный, так что все еще остается во входном потоке.

  2. Затем cin.getline(event, 30, '\n'); попытается извлечь строку из cin с не более 29 символов, и останавливается, когда он достигает \n. Как мы только что видели, \n после foo остался в потоке, поэтому он будет читать только до того, что на самом деле не имеет никаких символов перед ним. Затем извлекается и отбрасывается \n, а event будет пустой строкой.

  3. Затем вы делаете cin.ignore();, который игнорирует один символ. Следующий символ в потоке после этого \n - это s в начале something. Так что он извлекается и отбрасывается.

  4. Затем вы выводите event, который является пустой строкой, поэтому вы получаете пустую строку.

  5. Тогда cin.getline(details, 256, '\n'); будет добывать до 255 символов, пока не попадает в \n, который в этом случае будет извлекать omething (помните, мы alread игнорировали s), а затем извлечь и выбросить следующий \n.

  6. Тогда cin.ignore() проигнорирует первый символ blah blah, который является b.

  7. Затем выводите details который содержит omething.

  8. Затем вы выводите системное время, которое, как вы говорите, прекрасно, поскольку оно не поступает из входного потока.

Таким образом, основная проблема заключается в том, что вы используете cin.ignore() в неположенном месте. Вы используете его после getline, но getlineделает извлечение и сброс \n в конце строки. Место, которое вам нужно использовать cin.ignore(), - это когда вы используете >> для извлечения из cin. Это не извлекает новую линию, она просто останавливается на ней.

Просто избавься от cin.ignore() у вас есть на данный момент и поместите его после cin>>outFileName;.

Однако рассмотрите вопрос, когда пользователь вводит имя foo bar. foo будет извлечен, но bar\n останется в потоке. Если вы хотите проигнорировать остальную часть строки, вам нужно сделать следующее:

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
Смежные вопросы