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


Автор: m0dest 26.2.2007, 11:00
Есть файл num.dat :
String1
String2
String3
String4

Хочу считать содержимое в массив строк. Пишу:

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

void main()
{
    char *s[4];
    const int SIZE=80;
    char buffer[SIZE];

    ifstream inClientFile( "num.dat", ios::in );

    for( int i=0; i<4; i++)
    {
        inClientFile.getline(buffer,SIZE);
        s[i]=buffer;
        cout<<s[i]<<endl;
    }
    
    inClientFile.close();
    
    cout<<s[0];
} 

При запуске выдает:
String1
String2
String3
String4
String4

Почему последняя строка "String4"? s[0] должно же быть равно String1?


Автор: Sartorius 26.2.2007, 11:05
 Потому, что память надо выделять под строки и их из буффера в массив копировать, а ты только указатель копируешь. 

Автор: Daevaorn 26.2.2007, 11:07
m0dest, если уж на то пошло, то используй std::string и не мучайся.

Автор: Vyacheslav 26.2.2007, 11:07
Потому что, в принципе это вообще работать не должно. Просто Вам везет smile
Код

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

void main()
{
   // char *s[4];
   string s[4];
    const int SIZE=80;
    char buffer[SIZE];

    ifstream inClientFile( "num.dat", ios::in );

    for( int i=0; i<4; i++)
    {
        //inClientFile.getline(buffer,SIZE);
        //s[i]=buffer;
        inClientFile >> s[i];
        cout<<s[i]<<endl;
    }
    
    inClientFile.close();
    
    cout<<s[0];
} 



Автор: m0dest 26.2.2007, 11:24
какие-то непонятные ошибки в 17, 18 и 23 строке

error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable c
onversion)

Автор: Vyacheslav 26.2.2007, 11:33
Код

#include <iostream>
#include <fstream>
//#include <cstring>
#include <string>

Цитата(Vyacheslav @  26.2.2007,  11:07 Найти цитируемый пост)
Потому что, в принципе это вообще работать не должно. Просто Вам везет 

Кстати забираю свои слова обратно. Ваша код работоспособен smile , но не совсем логичен
Код

s[i]=buffer;

Эта строка каждый раз присваивает  один и тот же адрес, указывающий на один  и тот же буфер.
А содержимое буфера после очерного чтения меняется. После окночания цикла там содержится String4
. 

Автор: m0dest 26.2.2007, 11:38
Vyacheslav, спасибо огромное, что объяснили. Я прямо не нарадуюсь.  smile 

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