Ввод и вывод файлов через потоки.
От: a1ien.n3t  
Дата: 21.05.08 16:54
Оценка:
вобщем есть такой код.

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
char name[32];    
fstream os("123.txt");
    os<<"asdlkalskdjkjaljdlk";
    os>>name;
    cout<<name;


return 1;
}

Проблема в том, что он не считывает строчку которую вывел в файл.
Тоесть записать то он записал а вот выводить не хочет.

PS юзать fopen и иже с ним не предлагать нужны именно потоки.
fstream
Re: Ввод и вывод файлов через потоки.
От: Maxim S. Shatskih Россия  
Дата: 21.05.08 18:36
Оценка: +2 -3 :)
AN>PS юзать fopen и иже с ним не предлагать нужны именно потоки.

Юзать надо то, что работает, а не бредовую misdesigned абстракцию.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: Ввод и вывод файлов через потоки.
От: a1ien.n3t  
Дата: 21.05.08 19:38
Оценка:
Проблема решена я просто забыл что поле записи указатель сдвинется.
Здравствуйте, Maxim S. Shatskih, Вы писали:

AN>>PS юзать fopen и иже с ним не предлагать нужны именно потоки.


MSS>Юзать надо то, что работает, а не бредовую misdesigned абстракцию.


Когда ты переезжаешь операторы << и >> для работы со своим классом и тебе надо и писать и читать в файлом. То я лучше немного повожусь с потоками )
Re: Ввод и вывод файлов через потоки.
От: c-smile Канада http://terrainformatica.com
Дата: 21.05.08 20:34
Оценка: :)
Здравствуйте, a1ien.n3t, Вы писали:

AN>Проблема в том, что он не считывает строчку которую вывел в файл.

AN>Тоесть записать то он записал а вот выводить не хочет.

А с какой позиции в потоке тебе нужно "выводить"?

AN>PS юзать fopen и иже с ним не предлагать нужны именно потоки.


Так шашечки или зачет сдавать?
Re: Ввод и вывод файлов через потоки.
От: LaptevVV Россия  
Дата: 22.05.08 05:13
Оценка: 24 (2)
Здравствуйте, a1ien.n3t, Вы писали:

AN>вобщем есть такой код.


AN>
AN>#include <iostream>
AN>#include <fstream>
AN>using namespace std;
AN>int main()
AN>{
AN>char name[32];    
AN>fstream os("123.txt");               сделай его явно входным-выходным 
AN>    os<<"asdlkalskdjkjaljdlk";
    os>>>name;   опечатка? 
AN>    cout<<name;
AN>return 1;
AN>}
AN>

AN>PS юзать fopen и иже с ним не предлагать нужны именно потоки.
И это тоже потоки, между прочим.
Читай сюда:

Операция operator>> позволяет вводить и символьные массивы, и строки типа string, однако ввод выполняется только до первого символа-разделителя (обычно это пробел). Например, мы объявили в программе символьный массив

char s[50];

и собираемся ввести в s строку «привет от строки», выполнив операцию
cin >> s;

В массив попадет только первое слово «привет». Точно так же операция работает и при вводе строки в переменную типа string.
ПРИМЕЧАНИЕ
Операции ввода/вывода для типа string реализованы в <string>, а не в <iostream>. Все операции реализованы как внешние функции.
Для ввода строк с пробелами в символьный массив мы должны воспользоваться либо методом get(), либо getline()[1-27.1.6.3].
Либо установить флаг, лиюо использовать манипулятор
Метод get() позволяет вводить в символьный массив из n элементов не более n-1 символов, следит за символом завершения ввода и проставляет после введенных символов нулевой байт. Метод перегружен и имеет несколько прототипов
int_type get( );
istream& get(char& Ch);
istream& get(char *str, streamsize count);
istream& get(char *str, streamsize count, char delim);

Первые два вида метода get(), как мы уже знаем, применяются для ввода символов. Последние два — для ввода строк. Для ввода строки с пробелами в массив s нам достаточно написать в программе вызов
cin.get(s, 50);

Завершается ввод, как всегда, клавишей <Enter>, при нажатии которой во входной поток попадает символ ‘\n’, а в массив символов на последнее место записывается нулевой байт. Чтобы можно было корректно продолжить ввод (следующей строки), этот символ ‘\n’ надо удалить из входного потока. Это делается методом ignore()[1-27.1.6.3], который извлекает символы из потока, ничего не занося в переменные. Таким образом, ввод одной строки в массив s выполняется так
cin.get(s,50); cin.ignore();

Символ ‘\n’ является символом завершения ввода строки по умолчанию, однако мы можем задать любой символ завершения, например точку ‘.’.
cin.get(s,50,'.'); cin.ignore();

Правда, для окончания ввода все равно придется нажимать клавишу <Enter>.
Метод ignore() на самом деле имеет два параметра:
 первый параметр – количество удаляемых из потока символов; по умолчанию равен 1;
 символ-ограничитель, который тоже удаляется из потока; значение по умолчанию — конец файла;
Прототип метода
istream& ignore(streamsize count = 1, int delim = EOF);

Поэтому мы можем пропустить вообще все символы потока. Наиболее часто метод используется для пропуска всех символов до конца строки:
cin.ignore(numeric_limits<std::streamsize>::max(),'\n');

ПРИМЕЧАНИЕ
Класс-шаблон numeric_limits [1-18.2.1] включает многообразные числовые пределы, зависящие от аппаратной платформы. Мы рассмотрим его в гл. 11.
Как видим, метод get() не слишком удобен. Функция-метод getline() работает при вводе строк аналогично методу get(), но еще и удаляет из входного потока тот самый символ-завершитель строки (тоже символ ‘\n’ по умолчанию), так что ignore() вызывать нет необходимости. Прототипы метода следующие
istream& getline(char* str,  streamsize count);
istream& getline(char* str,  streamsize count, char delim);

Наши примеры с использованием getline() выглядят так
cin.getline(s,50); 
cin.getline(s,50,‘.’);

Последовательность символов, естественно, можно вводить и методом read(), но мы этого делать не будем, так как это не слишком удобно — метод никак не обрабатывает конец строки, поэтому ошибку совершить очень легко.
Кстати, посчитать количество реально введенных символов позволяет такой хороший метод, как gcount()[1 27.1.6.3].
const int lineSize = 250;
char Buf[lineSize];
// читается до конца строки, но не более 250 символов
cin.getline(Buf, lineSize);
int readSymbol = cin.gcount();    // сколько символов фактически прочитано

Методы входного потока get() и getline()не предназначены для ввода строк типа string, так как в качестве первого параметра принимают указатель на символ. В библиотеке <string> имеется собственная функция getline()[1-21.3.7.9], которая позволяет нам вводить строки с символами-разделителями. Вызывать функцию надо так
string s;
getline(cin, s);        // -- ввод из стандартного потока

В качестве первого параметра это функция принимает поток. Очевидно, это сделано для большей общности, так как на месте первого параметра может стоять не только стандартный поток cin, а, например, файловый поток.
Эта функция (вернее, шаблон функции) перегружена и может иметь третий параметр, представляющий собой ограничитель строки — аналогично методу getline() из <iostream>. Поэтому вводить строку можно и так:
string s;
getline(cin, s,'.');    // -- ввод из стандартного потока

Точка является завершающим символом строки (однако нажимать клавишу <Enter> все равно необходимо), она не включается в строку, и в переменную s попадут символы до точки. Например, мы набираем на клавиатуре следующую строку
привет от строки. продолжение строки.
В переменную s будут занесена строка
привет от строки
Как видите, поведение этой функции совершенно аналогично поведению одноименного метода из <iostream>.
ВНИМАНИЕ
Русские символы, вводимые с клавиатуры в строковые переменные, затем правильно выводятся на экран в консольное окно — никаких специальных действий для перекодировки выполнять не требуется.

Вместо cin ставь свой файл.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
ввод-вывод строки
Re: Ввод и вывод файлов через потоки.
От: TheBeard Россия  
Дата: 22.05.08 08:56
Оценка:
AN>
char name[32];    
fstream os("123.txt");
os<<"asdlkalskdjkjaljdlk";
// здесь вставить os.seekg(0);
os>>>name;

AN>

А если os.seekg(0) между выводом и вводом вставить? Указатель-то в файле должен был сместиться после записи.
Re[3]: Ввод и вывод файлов через потоки.
От: Maxim S. Shatskih Россия  
Дата: 22.05.08 20:03
Оценка: -1
AN>Когда ты переезжаешь операторы << и >> для работы со своим классом и тебе надо и писать и читать в файлом. То я лучше немного повожусь с потоками )

Сделай вместо << и >> по-человечески, т.е. ->Load и ->Save. В них пиши в файл через fwrite, write или WriteFile.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[4]: Ввод и вывод файлов через потоки.
От: Draqon  
Дата: 23.05.08 10:25
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

AN>>Когда ты переезжаешь операторы << и >> для работы со своим классом и тебе надо и писать и читать в файлом. То я лучше немного повожусь с потоками )


MSS>Сделай вместо << и >> по-человечески, т.е. ->Load и ->Save. В них пиши в файл через fwrite, write или WriteFile.


Ну и зачем объекту знать, куда он сериализуется?
Вообще, iostream в С++ не такая уж бредовая концепция, на самом деле. Реализация, конечно не очень, особенно которая от Dinkumware....
Re: Ввод и вывод файлов через потоки.
От: AOD Россия  
Дата: 23.05.08 11:15
Оценка:
Здравствуйте, a1ien.n3t, Вы писали:

AN>вобщем есть такой код.


AN>
AN>#include <iostream>
AN>#include <fstream>
AN>using namespace std;
AN>int main()
AN>{
AN>char name[32];    
AN>fstream os("123.txt");
AN>    os<<"asdlkalskdjkjaljdlk";
    os>>>name;
AN>    cout<<name;


AN>return 1;
AN>}

AN>

AN>Проблема в том, что он не считывает строчку которую вывел в файл.
AN>Тоесть записать то он записал а вот выводить не хочет.

AN>PS юзать fopen и иже с ним не предлагать нужны именно потоки.



сделай так и будет тебе счастье!

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    char name[32];   
    ofstream os("123.txt");
    os << "asdlkalskdjkjaljdlk";
    os.close();

    ifstream is("123.txt");
    is >> name;
    is.close();
    cout << name;
    return 0;
}


З.Ы. Открой книжку и почитай главу "потоки и файлы", много полезного написано...
Re[5]: Ввод и вывод файлов через потоки.
От: igna Россия  
Дата: 23.05.08 12:14
Оценка:
Здравствуйте, Draqon, Вы писали:

D>Ну и зачем объекту знать, куда он сериализуется?


А если вместо object->Save(stream) использовать Save(object, stream), то это все еще хуже чем stream << object ?
Re[6]: Ввод и вывод файлов через потоки.
От: Draqon  
Дата: 23.05.08 12:23
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Draqon, Вы писали:


D>>Ну и зачем объекту знать, куда он сериализуется?


I>А если вместо object->Save(stream) использовать Save(object, stream), то это все еще хуже чем stream << object ?


А это одно и то же. Разница, в основном, синтаксическая. И кстати, в чём разница между Save(object, stream) и operator<<(stream, object)?
Я, вообще-то, говорил о том, что топикстартеру посоветовали в методе Save() воспользоваться fwrite() вместо <<, и будет ему счастье. Вопрос, останется ли это счастье, когда нужно будет — в дополнение к файлу — сэйвиться ещё куда-нибудь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.