Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Запись STL в файл.


Автор: Sweras 10.6.2007, 12:29
Здравствуйте!
Надо записать элементы STL-списка в файл. Почитал MSDN, некторые другие материалы и написал вот это:
Код

#include "stdafx.h"
#include <list>
#include <algorithm>
#include <string>
#include <stdio.h>

using namespace std;
typedef list<string> LISTSTR;
FILE *stream;

void main(void)
{
    LISTSTR listOne;
    LISTSTR::iterator i;
    
    listOne.push_front("трактор");
    listOne.push_front("самолет");
    listOne.push_front("БТР");
    listOne.push_back("баржа");

    listOne.sort();

    if((stream = fopen("data.txt","w+t")) != NULL )
    {
     for (i = listOne.begin( ); i!= listOne.end( ); i++)
     {
        fwrite(*i,sizeof(string),size(listOne),stream);
     }
      fclose(stream);
   }
    
}


Это программа - компановка нескольких стандартных примеров, ибо в С++ я мало что понимаю.
Как следствие - компилятор выдает ошибку и тыкает пальцем в сторону первого аргумента ф-ии  fwrite. Поможите советом, а?
И еще. 
sizeof(string)
Как написать код, который бы определял размер КОНКРЕТНОЙ переменной, а не класса строки?
Заранее благодарен.

Автор: zkv 10.6.2007, 12:58
Цитата(Sweras @  10.6.2007,  12:29 Найти цитируемый пост)
Как написать код, который бы определял размер КОНКРЕТНОЙ переменной, а не класса строки?

метод std::string::length():
Код

std::string str;
int i = str.length();


и вообще
Код

ofstream fOut("data.txt");
    if( !fOut )
    {
     for (i = listOne.begin( ); i!= listOne.end( ); i++)
     {
        fOut<<*i;
     }
      fOut.close();
   }

Автор: Ulysses4j 10.6.2007, 13:23
Я бы даже сказал:
Код

#include <iterator>
#include <cstdlib>
//...
    ofstream fOut("data.txt");
    if( NULL == fOut ) {
        //proccess "file not found" error
        exit( EXIT_FAILURE );
    }

    std::copy( listOne.begin(), listOne.end(), std::ostream_iterator<string>( fOut, "\n" ) );

Автор: zkv 10.6.2007, 18:42
Ulysses4j, да, только cstdlib подключать не нужно, нужен fstream  smile 

Автор: Ulysses4j 10.6.2007, 18:48
На счет <fstream> совершенно справедливое замечание. Но cstdlib для exit(). Вообще, я обычно return какой-нибудь ненулевой ставлю. А это просто смотрел книжку Джосаттиса - он там пользуется exit( EXIT_FAILURE ) в такой ситуации. Всегда хочется стать на плечи великих...  smile 

Автор: zkv 10.6.2007, 19:21
Цитата(Ulysses4j @  10.6.2007,  18:48 Найти цитируемый пост)
Но cstdlib для exit().

проморгал... сорри. 
Уже забыл как он (exit) выглядит smile
С ним проблемы могут быть только если нам важно, чтобы по завершении работы правильно были вызваны деструкторы объектов в стеке (насчет тех, которые в сегменте данных -  я не в курсе, может просветит кто-нибудь, будут ли для них вызваны деструкторы?) 
Вобщем важно понимать когда и что делаешь. Правда не всегда получается smile

сделал пример для тестирования:
Код

#include <iostream>
#include <string>

class MyClass
{
    std::string m_Where;
public:
    MyClass( const std::string &Where )
        : m_Where( Where )
    {}

    ~MyClass()
    {
        std::cout<<"\nMyClass::~MyClass() in "<<m_Where;
    }
};

MyClass myclass( "data segment" );

int main()
{
    MyClass myclass( "stack" );
    exit(10);//с этой строкой и без нее
}
Цитата(Без exit(10);)

MyClass::~MyClass() in stack
MyClass::~MyClass() in data segment


Цитата(При exit(10);)

MyClass::~MyClass() in data segment

Автор: Ulysses4j 10.6.2007, 19:25
Ого! Неожиданный для меня результат. Спасибо, zkv, я это учту на будущее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)