C ++ / ofstream только с строковым типом

0

Вот мой код:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main() {

string nom_fich("data.dat");

ofstream fichier(nom_fich.c_str());
string name;
cout <<"The name is: "<< name ;
cin>>ws;
if (getline(cin, name)){
    fichier << name <<endl;
    } else {        
      cerr <<"Error!";  
}
fichier.close();

   return 0;
   }

Вопрос: почему, если я ввожу число вместо строки, моя программа не говорит мне "Ошибка!". ?

EDIT: как я могу попытаться достичь своей цели? Я хочу получить "Ошибка!". когда я ввожу тип, который не является строкой типа.

  • 1
    Число может быть представлено в виде строки, поэтому operator>> использует интуитивно понятный подход: он обрабатывает любую последовательность непустых символов как строку. Это включает в себя цифры, а также. Кроме того, вместо создания избыточной переменной nom_fich , вы можете просто написать ofstream fichier("data.dat"); ,
Теги:
ofstream

6 ответов

4

Потому что число является допустимой строкой.

2

Числа могут быть представлены в виде строк, т.е. Строки могут содержать цифровые символы. Например:

std::string my_string("42");
std::cout << my_string[0]; // prints 4
std::cout << my_string[1]; // prints 2
1

Вы не можете ввести число. Вы можете ввести последовательность символов, которые могут быть интерпретированы как число, но эта последовательность все еще является символом. Эти символы соответствуют тому, что читает getline.

  • 1
    Я часто использую фразу «текстовое представление числа».
0

Чтение числа в виде строки, безусловно, будет работать: число просто представлено в виде последовательности символов. Если вы хотите, чтобы поток попытался прочесть номер и сбой, если он его не получил, вы бы использовали другой тип для чтения, например:

int number;
if (std::cin >> number) {
    std::cout << "ERROR: read a number: " << number << '\n';
}
else if (std::cin.clear(), std::getline(std::cin, name)) {
    std::cout << "read a name: " << name << '\n';
}

После безуспешного чтения номера состояние потока clear() ed и вместо этого оно пытается прочитать имя. Существует тонкая проблема, так как форматированный ввод для int будет пропускать ведущие пробелы, а std::getline() не пропускает пробелы. Если пропустить std::noskipws пробелы - проблема, просто используйте манипулятор std::noskipws прежде чем пытаться прочитать int.

0

Число может быть представлено в виде строки, поэтому std::ifstream::operator >> принимает интуитивный подход: он обрабатывает любую последовательность std::ifstream::operator >> символов в виде строки. Сюда также входят десятичные цифры.


Не связанный, но вместо создания избыточной временной переменной nom_fich для имени вы можете просто написать ofstream fichier("data.dat"); ,

  • 0
    OP использует std::getline а не operator>> .
0

Поскольку строка "123" такая же допустимая, как строка "abc", или строка "def999".

Что касается "как я могу попытаться достичь своей цели?", Вы должны объяснить нам, какова ваша цель, потому что ваш собственный вход не определяет вашу цель, и поэтому мы не можем извлечь из нее вашу цель.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню