Есть ли C ++ способ написать файл с любым типом данных? - PullRequest
0 голосов
/ 20 августа 2010

Как эта функция в C:

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

Я посмотрел в потоке файла C ++ и нашел этот:

ostream& write ( const char* s , streamsize n );

этот принимает только char* вместо void*

но действительно ли это имеет значение, если я использую функцию fwrite C в стиле c ++?

Ответы [ 4 ]

3 голосов
/ 20 августа 2010

Потоки, вероятно, то, что вы ищете, если я не понимаю ваш вопрос. Существует много разновидностей, которые обрабатывают различные задания, например, вывод в файл:

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


int main()
{
    ofstream f("c:\\out.txt");

    const char foo[] = "foo";
    string bar = "bar";
    int answer = 42;

    f << foo << bar<< answer;

    return 0;
}

... строит цепочки, как если бы вы printf:

#include <cstdlib>
#include <sstream>
#include <string>
#include <iostream>
using namespace std;


int main()
{
    stringstream ss;

    const char foo[] = "foo";
    string bar = "bar";
    int answer = 42;

    ss << foo << bar<< answer;
    string my_out = ss.str();

    return 0;
}

... и они могут даже обрабатывать ваши собственные типы, если вы скажете им, как:

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

class MyGizmo
{
public:
    string bar_;
    int answer_;

    MyGizmo() : bar_("my_bar"), answer_(43) {};
};

ostream& operator<<(ostream& os, const MyGizmo& g)
{
    os << g.bar_ << " = " << g.answer_;
    return os;
}
int main()
{
    MyGizmo gizmo;
    cout << gizmo;

    return 0;
}
2 голосов
/ 20 августа 2010

Вы можете использовать любой из них. Использование char * вместо void * не имеет большого значения - и fwrite, и ostream::write обычно используются для различных типов данных (при использовании C ++ вам необходимо добавить явное приведение к char *, где в C приведение произойдет неявно, при условии, что вы включили правильный прототип для fwrite).

0 голосов
/ 20 августа 2010

В отличие от уже заданных ответов, между fwrite () и ostream :: write () есть важное различие.

fwrite () записывает двоичные данные без изменений (ну, на этих слабых не-Unix-платформах есть перевод конца строки, если файл не открыт в двоичном режиме).

ostream :: write () использует локаль для преобразования каждого символа, поэтому он принимает char * вместо void *. Обычно он использует язык по умолчанию "C", который не выполняет никаких преобразований.

Помните, что basic_ostream - это средство форматирования поверх basic_streambuf, а не двоичный приемник.

0 голосов
/ 20 августа 2010

В C ++ вы захотите использовать std::ofstream объекты для записи в файл.Они могут принимать данные любого типа, используя оператор <<, почти так же, как std::cout для записи в консоль.Конечно, точно так же как std::cout, если вы хотите напечатать пользовательский тип, вам нужно определить для него перегрузку operator<<.

Пример:

std::ofstream outfile("myfile.txt");

int i = 5;
double d = 3.1415926535898;
std::string s = "Hello, World!";

outfile << i << std::endl;
outfile << d << std::endl;
outfile << s << std::endl;

Дляиспользуйте std::ofstream, вам нужно #include <fstream>.

Объект outfile автоматически закроет файл при его разрушении или вы можете вызвать его метод close().

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