Вопрос

С помощью этого кода я попытался распечатать строку «foo» 10 раз в двоичном формате.Но почему функция для этого не работает?

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

template <typename T> void WriteStr2BinFh (string St, ostream &fn) {
     for (unsigned i = 0; i < St.size(); i++) {
         char CStr = St[i];
         fn.write(&CStr.front(), CStr.size());
     }
     return;
}

int main() {
   string MyStr = "Foo";
   ofstream myfile;
   myfile.open("OuputFile.txt", ios::binary|ios::out);

   // We want to print it 10 times horizontally
   // separated with tab

  for (int i = 0; i < 9; i++) {
      WriteStr2BinFh(Mystr+"\t", myfile);
   }

   myfile.close();   
}
Это было полезно?

Решение

Здесь так много неправильного, я просто перечислю все, что вижу:

Ваше условие цикла for должно быть i < 10.

Почему вы используете шаблон, а не шаблонный параметр T?

Вы вызываете метод front() для CStr, но CStr — это символ, а не строка, поэтому я даже не знаю, как это компилируется.

Предполагая, что CStr является строкой, вы не хотите брать адрес итератора front() с помощью &, вместо этого вы хотите сказать что-то вроде:

fn.write(St.c_str(), St.size());

И вы не хотите зацикливаться на итерациях St.size().Просто сделайте вышеперечисленное.

Другие советы

омг, там много ошибок:

  • int main — должно возвращать значение;
  • вы не используете шаблон < typename T > в своей функции;
  • Mystr — неправильное имя при вызове функции, имена в C++ чувствительны к регистру;
  • char CStr - нет метода, и std::string тоже;
  • вы не смогли получить адрес первого элемента, как в случае с вектором;
  • будет лучше, если вы примете std::string как константную ссылку;
  • вы забыли включить заголовок строки;
  • ...

исправил ваш пример с организацией вашего кода и вашим именем:

#include <iostream>
#include <fstream>
#include <string>

void WriteStr2BinFh( const std::string& St, std::ostream &out ) 
{
    out.write( St.c_str(), St.size() );
}

int main() 
{
    std::string MyStr = "Foo";
    std::ofstream myfile( "OuputFile.txt", std::ios::binary | std::ios::out );


    for (size_t i = 0; i < 9; ++i) 
    {
        WriteStr2BinFh( MyStr+"\t", myfile );
    }

   myfile.close();   
   return 0;
}

но я рекомендовал использовать std::fill_n алгоритм

std::fill_n( std::ostream_iterator< std::string >( myfile, "\t" ), 10, MyStr );

Первый, char CStr Говорит, что CStr это один символ.Второй, fn.write(&CStr.front(), CStr.size()); рассматривает этот символ как контейнер, например std::vector<>, который, конечно, не может скомпилироваться.

Полагая, что все до WriteStr2BinFh все в порядке, я не проверял, вот как WriteStr2BinFh следует (можно) посмотреть:

void WriteStr2BinFh(const string& St, ostream &fn)
{
    for(string::iterator it = St.begin(); it != St.end(); ++it)
    {
        fn.put(*it);
    }
}

или, желательно

void WriteStr2BinFh(const string& St, ostream &fn)
{
    fn.write(St.c_str(), St.length());
}

Важные моменты для выполнения операции ввода-вывода в двоичном режиме:

  • Файл необходимо открыть в режиме вывода и в двоичном режиме, используя флаги ios::out (режим вывода) и ios::binary(двоичный режим).
  • Функция write принимает два параметра.Первый параметр имеет тип char* для записываемых данных, а второй имеет тип int и запрашивает размер данных, записываемых в двоичный файл.
  • В конце файл должен быть закрыт.

    void write_to_binary_file(WebSites p_Data)
    {
        fstream binary_file("c:\\test.dat",ios::out|ios::binary|ios::app);
        binary_file.write(reinterpret_cast<char *>(&p_Data),sizeof(WebSites));
        binary_file.close();
    }
    

    Эта двоичная функция ввода-вывода записывает в функцию некоторые данные.

  • Файл открывается в выходном и двоичном режиме с помощью ios::out и ios::binary.Есть еще один спецификатор ios::app, который сообщает операционной системе, что файл также открыт в режиме добавления.Это означает, что любой новый набор данных будет добавлен в конец файла.

  • Функция записи, использованная выше, нуждается в параметре как тип указателя символа.Поэтому мы используем преобразователь типов reinterpret_cast для приведения структуры к типу char*.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top