Форум: Форум C++Разное
Новые темы: 00
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как работать с файлами?
 
 автор: Киналь   (25.02.2007 в 16:04)   письмо автору
 
 

Как в С++ работать с файлами? Нашел в сети аж два способа:

fstream myfile;
myfile.open("c:\\test.txt", ios::out);

и

#include <fstream.h>
......
FILE* myfile;
file = fopen("c:\test.txt""r");

Правда, ни тем, ни другим способом не получилось))

Как же правильно? Буду признателен за пример открытия-чтения-записи.

  Ответить  
 
 автор: cheops   (25.02.2007 в 16:12)   письмо автору
 
   для: Киналь   (25.02.2007 в 16:04)
 

Оба варианта являются правильными, первый в стиле C++, второй в стиле C.

1) Что вы хотите сделать? Вывести содержимое файла в стандартный поток, поместить в переменную или выполнить какие-то другие преобразования с файлом?
2) Что не получается, каки сообщения об ошибках выводятся?

  Ответить  
 
 автор: Киналь   (25.02.2007 в 17:28)   письмо автору
 
   для: cheops   (25.02.2007 в 16:12)
 

>1) Что вы хотите сделать? Вывести содержимое файла в стандартный поток, поместить в переменную или выполнить какие-то другие преобразования с файлом?

Поскольку не знаю твердо, что такое стандартный поток, то сначала открыть, потом считать построчно, результат записать в переменную, потом из другой переменной записать текст в файл. То есть аналог такого РНР-кода:

myfile = fopen("/test.txt""a+");
f_arr = file(myfile);  
fputs(myfile, "Any Text");
fclose(myfile);


>2) Что не получается, каки сообщения об ошибках выводятся?
В первом случае я просто не нашел нужных функций для чтения и записи)) А во втором - трудновоспроизводимую ошибку насчет ошибки обращения к такому-то адресу.

  Ответить  
 
 автор: oleg_alexeev   (26.02.2007 в 10:49)   письмо автору
 
   для: Киналь   (25.02.2007 в 17:28)
 

Вот аналог приведенного PHP-кода:


#include <fstream>
#include <string>
#include <vector>
using namespace std;
typedef vector<string> StringArray;


int main(int argc, char *argv[])
{
  string str;

  ifstream in;
  in.open("c:/tmp/test.txt");
  if (in.fail()) return 0;

  StringArray content;
  while (!in.eof())
  {
    in >> str;
    content.push_back(str);
  }

  in.close();

  ofstream out;
  out.open("c:/tmp/test.txt");
  if (out.fail()) return 0;
  str = "Hello world!";
  out << str << endl;

  return 0;
}


Содержимое файла сохранено в массиве 'content'.
В файл выведена строка "Hello world!"

  Ответить  
 
 автор: Киналь   (26.02.2007 в 19:18)   письмо автору
 
   для: oleg_alexeev   (26.02.2007 в 10:49)
 

Спасибо за пример, почти все понял. Только два вопроса:
- чем отличается ifstream от ofstream и оба они от fstream?
- что означает строка out << str << endl? Точнее, ее вторая часть - << endl?

  Ответить  
 
 автор: Фитч   (26.02.2007 в 20:57)   письмо автору
 
   для: Киналь   (26.02.2007 в 19:18)
 

ifstream и ofstream - потомки fstream соответственно для ввода и вывода
endl - конец строки и очистка внутреннего буфера оъекта потока

  Ответить  
 
 автор: Киналь   (26.02.2007 в 22:07)   письмо автору
 
   для: Фитч   (26.02.2007 в 20:57)
 

>ifstream и ofstream - потомки fstream соответственно для ввода и вывода
То есть ofstream myfile - это то же, что и

fstream myfile;
myfile.open("c:\\test.txt", ios::out);

?

>endl - конец строки и очистка внутреннего буфера оъекта потока
Это, видимо, встроенная константа?

  Ответить  
 
 автор: Фитч   (27.02.2007 в 09:21)   письмо автору
 
   для: Киналь   (26.02.2007 в 22:07)
 

endl - да, это что то вроде константы, указывающей объекту, что здесь нужно вставить в поток "\r\n" и вызвать метод flush() для очистки внутреннего буфера.

А с ifstream'ом, прости, я ошибся. Это не подкласс fstream, это класс, предназначенный для ввода (ofstream - Для вывода) данных, по сути у него в конструкторе другое значение по умолчанию для режима:

fstream - ios::trunk
istream - ios::in | ios::trunk
ofstream - ios::out | ios::trunk

Причем все они - потомки basic_iostream, basic_istream и basic_ostream соответственно. Подробнее смотри fstream.h и iostream.h

  Ответить  
 
 автор: alex19921992   (27.02.2007 в 12:21)   письмо автору
 
   для: Фитч   (27.02.2007 в 09:21)
 

короче, если в поток вбухать информацию, то он ее будет просто там хранить. А чтобы вся информация попала на экран, надо бухнуть в поток такую штуку, как endl. endl выводит на экран из потока все, что еще не было выведено.

  Ответить  
 
 автор: Киналь   (27.02.2007 в 17:51)   письмо автору
 
   для: Фитч   (27.02.2007 в 09:21)
 

Теперь все вроде ясно, спасибо!

Эх, сколько всего нужно изучать-то=) Библиотек-то фигова туча оказывается...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования