русский
Germany.ruForen → Архив Досок→ Webdesign und Hosting

C++

13.02.05 18:25
Re: C++
 
scorpi_ студент
Во-первых, если у Вас строка типа Петров Иван 45, то вызов функции должен выглядеть следующим образом: fscanf( fp, "%s %s %d\n", &lastname, &name, &age ,0); Но, в реальной жизни эту функцию лучше не использовать, так как fscanf копирует поля в переменные не проверяя достаточен ли размер буфера, то есть с этой функцией очень легко получить buffer overflow. Если Вам надо прочитать строку, то используйте fgets, с дальнейшей разбивкой строки на поля с помощью strtok, strchr и других функций из strng.h, с дальнейшей проверкой полученных полей.
Но, вс╦ вышесказанное собственно говоря неважно, так как Вы написали в заголовке С++, в то время как вс╦ вышесказанное относится к С. Я Вам очень порекомендую почитать книгу для начинающих по С++, например Accelerated C++ Энди К╦нига. И кроме того, пользуйтесь насколько это возможно стандартным С++. В данном случае std::string, std::ifstream и так далее.
В С++ стиле Ваша задача будет выглядеть примерно так:
#include <cstdlib>
#include <string>
#include <fstream>
#include <deque>
template< class ch, class tr, class al >
std::deque<std::basic_string<ch, tr, al> > split( const std::basic_string<ch, tr, al>& line, const ch* space )
{
std::deque< std::basic_string<ch, tr, al> > v;
for ( std::basic_string<ch, tr, al>::size_type end = 0,
begin = line.find_first_not_of( space, end ,0);
begin != std::basic_string<ch, tr, al>::npos;
begin = line.find_first_not_of( space, end ) )
{
end = line.find_first_of( space, begin ,0);
if ( end == std::basic_string<ch, tr, al>::npos )
v.push_back( line.substr( begin ) ,0);
else
v.push_back( line.substr( begin, end - begin ) ,0);
}
return v;
}
class Person
{
std::string name_;
std::string lastname_;
int age_;
public:
Person( const std::string& line ) : age_(0)
{
std::deque<std::string> v = split( line, " " ,0);
if ( v.size() != 3 )
throw std::runtime_error( "invalid line" ,0);
name_ = v[0];
lastname_ = v[1];
age_ = atoi( v[2].c_str() ,0);
}
const std::string& name() const { return name_; }
const std::string& lastname() const { return lastname_; }
int age() const { return age_; }
};
int main()
{
std::deque< Person > students;
std::ifstream students_file( "data.dat" ,0);
while( students_file.good() && !students_file.eof() )
{
std::string buffer;
std::getline( students_file, buffer ,0);
students.push_back( Person( buffer ) ,0);
}
}


И наконец - хотя и бывают ситуации, когда текст файлы можно использовать, но вс╦ же почитайте книжки по базам данных.
veni, vidi... expuli

 

Sprung zu