Разница между ‘<<' и 'put()' для выходных файловых потоков

#c #fstream #iostream

#c #fstream #iostream

Вопрос:

Я пытаюсь понять разницу между оператором ‘<<‘ и функцией ‘put ()’ для записи символов в выходной файл.

Мой код:

 #include <fstream>
using namespace std;

int main() {
    ofstream out ("output.txt");

    int x = 1;

    // This produces the incorrect result ...
    out.put(x);
    
    // ... while this produces the correct result
    out << x;


    // These two produce the same (correct) result
    out.put('a');
    out << 'a';
    
    out.close;
}
  

Я понимаю, что out.put(x) это преобразует целое число 1 в символ в соответствии с кодом ASCII, но я не понимаю, почему этого не происходит, когда я использую out << x .

Однако out.put('a') выдает то же out << 'a' самое, что и .

Почему это так?

Комментарии:

1. ostream::put() выводит символ . Нет перегрузок для int или любого другого типа.

2. Оператор << as a streaming использует преобразование, вывод с учетом типов, языковой стандарт и язык, а также механизм преобразования, который является частью подсистемы ввода-вывода C . Некоторым людям не нравится это средство, потому что оно предоставляет довольно большую подсистему ввода-вывода для небольших программ. put Метод обходит большую часть этого механизма, чтобы просто вывести заданный символ.

Ответ №1:

 int x = 1;

// This produces the incorrect result ...
out.put(x);
  

Нет, он преобразует int в a char и выводит единицу char со значением 1 .

 // ... while this produces the correct result
out << x;
  

Это выполняет форматированный вывод и выводит представление значения x . Скорее всего, он покажет символ 1 , который отличается от символа со значением 1 .

 // These two produce the same (correct) result
out.put('a');
out << 'a';
  

Да, там нет преобразования. Вы сделали

 int x = 'A';
out.put(x);
out << x;
  

Вы, вероятно, увидите A65 , откуда A берется put(x) и 65 из форматированного вывода, поскольку 65 часто это значение 'A' .

Ответ №2:

Когда вы используете out << 1 , вы вызываете: operator<<(int val) а не: operator<<(char val) , тогда он может привести int к std::string .

Комментарии:

1. Средство вставки потока не выполняет преобразование из int в std::string . Он преобразует int значение в текст. Приведение — это то, что вы пишете в своем исходном коде, чтобы сообщить компилятору выполнить преобразование.