2015-06-01 2 views
0

Я написал код для ввода файлов ввода-вывода. этот код содержит две функции - одну, которая используется для записи символов в текстовый файл, а другая - для чтения символов из текстового файла.Я не могу понять, почему «cout» не работает должным образом

#define _CRT_SECURE_NO_WARNINGS 
#pragma once 
#include <iostream> 
#include <fstream> 

using namespace std; 

int writefile(const char* f) 
{ 
    int cnt = 0; 
    char c; 
    ofstream ofile; 
    ofile.open(f); 

    while (true) 
    { 
     cout << "input character:"; 
     cin >> c; 
     if (cin.eof()) 
      break; 
     ofile << c; 
     cnt++; 
    } 
    ofile.close(); 
    return cnt; 
} 

int readfile(int n, const char* f) 
{ 
    int cnt = 0; 
    ifstream ifile; 
    ifile.open(f); 

    do 
    { 
     cout << static_cast<char>(ifile.get()); 
     cnt++; 

    } while (cnt<n); 

    cout << endl; 

    ifile.close(); 
    return cnt; 
} 

int main(void) 
{ 

    char ch; 
    int num,total,sum; 
    const char* filename = "test.txt"; 


    total = writefile(filename); 

    cout << total<<" characters were written successfully." << endl; 

    cout << "how many characters?"; 
    cin >> num; 

    sum = readfile(num,filename); 

    cout << sum << " characters were read successfully." << endl; 

    system("pause"); 
    return 0; 
} 

проблема заключается в следующем: соиЬ < <; "сколько символов?" cin >> num;

этот часть не работает. Сначала я хотел отобразить введенное пользователем количество символов, но я не смог ввести количество символов. Я хочу, чтобы вы, ребята, решили, что проблема.

+11

'* не работает *' - очень плохое описание проблемы. * Как это не работает? Разве это не компилируется? Это крушение? Это приводит к чему-то неожиданному? Что-то загорелось? – Biffen

+0

Пожалуйста, покажите нам неправильное сообщение, которое поможет нам решить вашу проблему. – icecity96

+0

Это даже верно 'cin >> num; ***'? Это даже компилируется? – Javia1492

ответ

0

Проблема в том, что в writefile() вы читаете поток, пока не дойдете до конца файла. Как только вы сделаете это, будет установлен флаг конца файла в cin, и cin будет больше читать с ввода. Вам необходимо позвонить clear(), чтобы удалить флаг и продолжить чтение.

+0

благодарит ваш совет. проблема решена. снова, thx! –

+0

Ваш ответ в порядке, я, однако, смущен, почему мой не работает, так как я уверен, что вам нужно извлечь EOF из потока с помощью 'cin.unget()'. Просто очистить флаг [недостаточно] (http://en.cppreference.com/w/cpp/io/basic_istream/ignore). – vsoftco

0

Что вам нужно следующее, сразу после cout << "how many characters?";:

std::cin.clear(); 
std::cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); // must #include <limits>  
std::cin.unget(); // THIS IS IMPORTANT 

Первая строка сбрасывает флаг ошибки потока, установите ios::eofbit, так как вы не читать до конца файла. Вторая строка игнорирует все оставшиеся в потоке до и включая разделитель (в этом случае - новая строка '\n') или EOF (однако EOF is not discarded), в зависимости от того, что наступит раньше. Последняя строка важна, поскольку в противном случае ваш поток по-прежнему будет иметь EOF, поэтому вам нужно отбросить его.

+0

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

+0

@SeihyungOh Я не уверен, чего вы ожидаете. Он работает отлично на моем конце, он пишет символы в файл, а затем читает их обратно, полный код здесь http://ideone.com/2xFrqF. Как вы заканчиваете чтение? На linux вам нужны CTRL + D и Windows CTRL + Z. – vsoftco

+0

благодарит за вашу помощь. Я попробовал ваш код. но это не сработало. после ввода чисел программа остановлена. –

0

В writefile вы контактируете до cin.eof. eof означает «конец файла»: явно, здесь больше нет ввода. Само по себе это постоянное состояние, такое как пустое стекло: «Я пытаюсь сделать еще один глоток, но ничего не происходит!»

Вы можете позвонить cin.clear(), но это немного странно: как заполнение использованной жестяной банки. Лучший подход может быть, чтобы проверить на пустую строку например путем тестирования

if (c == '\n') 

Теперь пользователь может вводить символы, пока не будут сделаны, то они просто нажмите клавишу ВВОД.

Возможно, вы должны рассматривать eof как ошибку.