Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > потоки сохранение и считывания файла [C++]


Автор: ArniLand 27.5.2010, 20:50
Написал программу где нужно было использовать перегрузку <<, >> и сохранение и считывание в текстовый файл. Вопрос есть также, как правильно сделать пустым массив типа сhar? Про комментировал строку в программе где нужно это сделать. Компилятор VS 2008 professional. Выдает такие ошибки:
Цитата

d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\students.h(15) : error C2804: binary 'operator <<' has too many parameters
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\students.h(16) : error C2804: binary 'operator >>' has too many parameters
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(9) : error C2017: illegal escape sequence
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(9) : error C2001: newline in constant
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(9) : error C2146: syntax error : missing ';' before identifier 'n'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(9) : error C2065: 'n' : undeclared identifier
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(9) : error C2143: syntax error : missing ';' before 'string'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(10) : error C2146: syntax error : missing ';' before identifier 'cout'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(10) : error C2017: illegal escape sequence
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(10) : error C2001: newline in constant
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(10) : error C2146: syntax error : missing ';' before identifier 'n'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(10) : error C2065: 'n' : undeclared identifier
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(10) : error C2143: syntax error : missing ';' before 'string'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(11) : error C2146: syntax error : missing ';' before identifier 'stream'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(12) : error C2017: illegal escape sequence
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(12) : error C2001: newline in constant
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(12) : error C2146: syntax error : missing ';' before identifier 'n'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(12) : error C2065: 'n' : undeclared identifier
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(12) : error C2143: syntax error : missing ';' before 'string'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(13) : error C2146: syntax error : missing ';' before identifier 'stream'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(14) : error C2017: illegal escape sequence
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(14) : error C2001: newline in constant
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(14) : error C2146: syntax error : missing ';' before identifier 'n'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(14) : error C2065: 'n' : undeclared identifier
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(14) : error C2143: syntax error : missing ';' before 'string'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(15) : error C2146: syntax error : missing ';' before identifier 'stream'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(16) : error C2017: illegal escape sequence
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(16) : error C2001: newline in constant
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(16) : error C2146: syntax error : missing ';' before identifier 'n'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(16) : error C2065: 'n' : undeclared identifier
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(16) : error C2143: syntax error : missing ';' before 'string'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(17) : error C2146: syntax error : missing ';' before identifier 'stream'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(18) : error C2017: illegal escape sequence
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(18) : error C2001: newline in constant
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(18) : error C2146: syntax error : missing ';' before identifier 'n'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(18) : error C2065: 'n' : undeclared identifier
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(18) : error C2143: syntax error : missing ';' before 'string'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(19) : error C2146: syntax error : missing ';' before identifier 'stream'
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(43) : error C2228: left of '.Lastname' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(44) : error C2228: left of '.Name' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(45) : error C2228: left of '.Course' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(46) : error C2228: left of '.StudentCard' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(47) : error C2228: left of '.CityOfArrival' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(58) : error C2228: left of '.Lastname' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(59) : error C2228: left of '.Name' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(60) : error C2228: left of '.Course' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(61) : error C2228: left of '.StudentCard' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(62) : error C2228: left of '.CityOfArrival' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(64) : error C2228: left of '.Lastname' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(65) : error C2228: left of '.Name' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(66) : error C2228: left of '.Course' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(67) : error C2228: left of '.StudentCard' must have class/struct/union
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\main.cpp(68) : error C2228: left of '.CityOfArrival' must have class/struct/union
laba.cpp
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\students.h(15) : error C2804: binary 'operator <<' has too many parameters
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\students.h(16) : error C2804: binary 'operator >>' has too many parameters
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\laba.cpp(6) : error C2440: '=' : cannot convert from 'const char [1]' to 'char [100]'
        There is no context in which this conversion is possible
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\laba.cpp(7) : error C2440: '=' : cannot convert from 'const char [1]' to 'char [100]'
        There is no context in which this conversion is possible
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\laba.cpp(8) : error C2440: '=' : cannot convert from 'const char [1]' to 'char [100]'
        There is no context in which this conversion is possible
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\laba.cpp(9) : error C2440: '=' : cannot convert from 'const char [1]' to 'char [100]'
        There is no context in which this conversion is possible
d:\мои документы\visual studio 2008\projects\laba 2.4 c++\laba 2.4 c++\laba.cpp(10) : error C2440: '=' : cannot convert from 'const char [1]' to 'char [100]'
        There is no context in which this conversion is possible


Код программы:
Код

//Students.h
#include <iostream>
using namespace std; 

class Students
{
public:
    char Lastname[100];
    char Name[100];
    char Course[100];
    char StudentCard[100];
    char CityOfArrival[100];
    Students();
    ~Students();
    
    ostream &operator<<(ostream &stream, Students obj);  // жалуется на эти строки
    istream &operator>>(istream &stream, Students obj);
};
    
//laba.cpp
#include "stdafx.h"
#include "Students.h"

Students::Students()
{
    Lastname = "";//жалуется на эту строку
    Name = "";//как правильно сделать char пустым?
    Course = "";
    StudentCard = "";
    CityOfArrival = "";
}

Students::~Students()
{}

//main.cpp
#include "stdafx.h"
#include "Students.h"
#include <iostream>
#include <fstream>
using namespace std;

istream &operator>>(istream &stream, Students obj)
{
    cout << "Please, write the characteristics: "\n";//жалуется на эти строки
    cout << "Lastname: "\n";
    stream >> obj.Lastname;
    cout << "Name: "\n";
    stream >> obj.Name;
    cout << "Course: "\n";
    stream >> obj.Course;
    cout << "Student Card: "\n";
    stream >> obj.StudentCard;
    cout << "City of arrival: "\n";
    stream >> obj.CityOfArrival;
    return stream;
}


ostream &operator<<(ostream &stream, Students obj)
{
    stream <<"Lastname :" << obj.Lastname << "\n";
    stream <<"Name :" << obj.Name << "\n";
    stream <<"Course: "<< obj.Course << "\n";
    stream <<"Student Card: "<< obj.StudentCard  << "\n";
    stream <<"Course: "<< obj.CityOfArrival<< "\n";
    return stream;
}

int main()
{
    Students obj();
    ofstream out("study");//Создаем файл
    if(!out)
    {
        cout << "Can't open a file. \n";
        return 1;
    }
    out << obj.Lastname << "\n";//жалуется на эту строку
    out << obj.Name << "\n";//жалуется на эту строку
    out << obj.Course << "\n";//жалуется на эту строку
    out << obj.StudentCard << "\n";//жалуется на эту строку
    out << obj.CityOfArrival << "\n";//жалуется на эту строку
    
    out.close();

    ifstream in("study");//открываем файл для ввода данных
    if(!in)
    {
        cout << "Can't open a file. \n";
        return 1;
    }

    in >> obj.Lastname;//жалуется на эту строку
    in >> obj.Name;//жалуется на эту строку
    in >> obj.Course;//жалуется на эту строку
    in >> obj.StudentCard;//жалуется на эту строку
    in >> obj.CityOfArrival;//жалуется на эту строку
    
    cout <<"Lastname :" << obj.Lastname << "\n";
    cout <<"Name :" << obj.Name << "\n";
    cout <<"Course: "<< obj.Course << "\n";
    cout <<"Student Card: "<< obj.StudentCard  << "\n";
    cout <<"Course: "<< obj.CityOfArrival<< "\n";
    
    in.close();

    return 0;
}








Автор: boostcoder 27.5.2010, 21:02
раз уж пишите на с++, к чему эти баяны?
Цитата(ArniLand @  27.5.2010,  20:50 Найти цитируемый пост)
    char Lastname[100];
    char Name[100];
    char Course[100];
    char StudentCard[100];
    char CityOfArrival[100];

используйте строки.

Цитата(ArniLand @  27.5.2010,  20:50 Найти цитируемый пост)
// жалуется на эти строки

правильно жалуется. даже говорит что ему не нравится.

Автор: jonie 27.5.2010, 21:03
Цитата

Код

    ostream &operator<<(ostream &stream, Students obj);  // жалуется на эти строки


если у вас ДВА параметра, и вы хотите использовать operator<< в "привычном режиме"*, то вам нужно сделать этот метод friend-ом (friend, напомню, уже НЕ член класса и в части реализации указывать classname:: уже нет надобности).

Собственно friend нужен для доступа к внутренностям написанного вами класса и для удобной и синтаксически понятной записи.


*"привычный режим operator<<" - тут я подразумеваю вызов в виде cout<<1. Это преобразуется в operator<<(cout, 1)   (вызов по сути глобальной функции), т.к. если operator<< будет членом класса, то вызвать его придется как cout.operator<<(1) {вопрос к общественности: какие еще способы будут?}

Автор: ArniLand 27.5.2010, 21:19
jonie,Спасибо насчет подсказки с friend, ошибку исправил. Можете еще пожалуйста подсказать что не так с этими строками?

Код

istream &operator>>(istream &stream, Students obj)
{
    cout << "Please, write the characteristics: "\n";//жалуется на эти строки
    cout << "Lastname: "\n";
    stream >> obj.Lastname;
    cout << "Name: "\n";
    stream >> obj.Name;
    cout << "Course: "\n";
    stream >> obj.Course;
    cout << "Student Card: "\n";
    stream >> obj.StudentCard;
    cout << "City of arrival: "\n";
    stream >> obj.CityOfArrival;
    return stream;
}

/main.cpp
out << obj.Lastname << "\n";//жалуется на эту строку
    out << obj.Name << "\n";//жалуется на эту строку
    out << obj.Course << "\n";//жалуется на эту строку
    out << obj.StudentCard << "\n";//жалуется на эту строку
    out << obj.CityOfArrival << "\n";//жалуется на эту строку

in >> obj.Lastname;//жалуется на эту строку
    in >> obj.Name;//жалуется на эту строку
    in >> obj.Course;//жалуется на эту строку
    in >> obj.StudentCard;//жалуется на эту строку
    in >> obj.CityOfArrival;//жалуется на эту строку




Автор: jonie 27.5.2010, 21:41
ArniLand, "жалуется" ? А сиську не просит? КАК жалуется??
Код

    cout << "Please, write the characteristics: "\n";//жалуется на эти строки
тут вот явная ошибка - три кавычки, зачем перед \n кавычка?

Автор: ArniLand 27.5.2010, 21:50
Цитата

error C2228: left of '.Lastname' must have class/struct/union

ошибку такого плана оно выдает тут
Код

//main.cpp
out << obj.Lastname << "\n";//жалуется на эту строку
    out << obj.Name << "\n";//жалуется на эту строку
    out << obj.Course << "\n";//жалуется на эту строку
    out << obj.StudentCard << "\n";//жалуется на эту строку
    out << obj.CityOfArrival << "\n";//жалуется на эту строку
in >> obj.Lastname;//жалуется на эту строку
    in >> obj.Name;//жалуется на эту строку
    in >> obj.Course;//жалуется на эту строку
    in >> obj.StudentCard;//жалуется на эту строку
    in >> obj.CityOfArrival;//жалуется на эту строку

Автор: jonie 27.5.2010, 21:58
ну как минимум стОит передавать ссылку на Students, т.к. Students& в функции operator<< (и >>), т.к. копировать накладно... идейно ошибок не доллжно быть, вероятно вы упустили другие ошибки (более раннии) либо не сделали include с h файлом, где у вас объявление Students имеется (а также не сделали защиты от повторного включения в h файле!)

Автор: toxx 27.5.2010, 22:03
ArniLand
убери скобки 
Код

Students obj();

Автор: jonie 27.5.2010, 22:08
toxx, угу, гуд что заметил, я не лазил в вверх в код.
Для тех кто не в теме: скобки означают что объявлена функция (опережающее объявление) obj не принимающая аргументов и возращающая Students, а не объект (как задумывалось).

Автор: toxx 27.5.2010, 22:13
jonie
Просто уже не 1й раз пишет сюда, и все время одни и те же ошибки...
Уже сколько раз писали что лучше писать const, но я напишу еще раз может в след раз напишет как нужно =)
Код

istream &operator>>(istream &stream,const Students& obj)


Автор: ArniLand 27.5.2010, 22:20
toxx, вы немного ошиблись, там где оператор >> писать const

не нужно, а то буде выдавать оишбку

Автор: djamshud 27.5.2010, 22:26
ArniLand, ээмммм. Там же read-only. Const нужен, иначе константный объект не распечатаете.

Автор: toxx 27.5.2010, 22:39
djamshud
Ура! у меня последователи ;)
я вот все думаю.. не лучше выделять память динамически лучше тут?
ArniLand
Цитата

не нужно, а то буде выдавать оишбку

mutable

Автор: djamshud 28.5.2010, 01:45
toxx, ура! У меня появился кумир!

К черту mutable, его используют только в специфических случаях. Я не знаю, что за ошибки выдает компилятор, но идеологически в ту функцию нужно передавать объект по ссылке на константу.

Автор: toxx 28.5.2010, 21:44
djamshud
Цитата

ура! У меня появился кумир!

smile 

Автор: halfnode 11.2.2011, 03:58
Подниму тему, дабы не плодить.
Разбираюсь в потоках. 
Объясните пожалуйста, что не так в фукции read()?
write() пишет в файл все на ура. По крайней мере, размер файла соответствует тому, сколько объектов в него записано.
А вот чтение не проходит. Прям беда. Притом ошибка происходит уже после выполнения if(inFile.eof())
код, собственно:
Код

void Distance::write()
{
    ofstream outFile;
    outFile.open("DIST.DD", ios::trunc|ios::binary);
    if(!outFile)
    {cerr << "\nНевозможно открыть файл для записи данных.\n"; _getch(); exit(1);}

    for(int i=0; i<count; i++)
    {
        outFile.write((char*)(arrap[i]), sizeof(Distance));
    }
    if(!outFile)
    {cerr << "\nЗапись в файл невозможна.\n"; _getch(); exit(1);}
    outFile.close();
}

void Distance::read()
{
    ifstream inFile;
    inFile.open("DIST.DD", ios::binary);
    if(!inFile)
    {cerr << "\nНевозможно открыть файл для чтения данных.\n"; _getch(); exit(1);}
    int i=0;
    while(true)
    {
        arrap[i] = new Distance;
        inFile.read((char*)arrap[i], sizeof(Distance));
        if(inFile.eof())
            break;
        i++;
    }
    if(!inFile)
    {cerr << "\nНевозможно произвести чтение из файла.\n"; _getch(); exit(1);}
    inFile.close();
}


Уже даже не знаю что и думать. Где -то завис.

Автор: xvr 11.2.2011, 13:01
Для потоков EOF состояние - это ошибка. Вот он вам в 32 строке и говорит, что у него ошибка (по программе - ожидаемая, но ifstream этого не знает  smile )

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