|
|
|
| Как в С++ работать с файлами? Нашел в сети аж два способа:
fstream myfile;
myfile.open("c:\\test.txt", ios::out);
|
и
#include <fstream.h>
......
FILE* myfile;
file = fopen("c:\test.txt", "r");
|
Правда, ни тем, ни другим способом не получилось))
Как же правильно? Буду признателен за пример открытия-чтения-записи. | |
|
|
|
|
|
|
|
для: Киналь
(25.02.2007 в 16:04)
| | Оба варианта являются правильными, первый в стиле C++, второй в стиле C.
1) Что вы хотите сделать? Вывести содержимое файла в стандартный поток, поместить в переменную или выполнить какие-то другие преобразования с файлом?
2) Что не получается, каки сообщения об ошибках выводятся? | |
|
|
|
|
|
|
|
для: cheops
(25.02.2007 в 16:12)
| | >1) Что вы хотите сделать? Вывести содержимое файла в стандартный поток, поместить в переменную или выполнить какие-то другие преобразования с файлом?
Поскольку не знаю твердо, что такое стандартный поток, то сначала открыть, потом считать построчно, результат записать в переменную, потом из другой переменной записать текст в файл. То есть аналог такого РНР-кода:
myfile = fopen("/test.txt", "a+");
f_arr = file(myfile);
fputs(myfile, "Any Text");
fclose(myfile);
|
>2) Что не получается, каки сообщения об ошибках выводятся?
В первом случае я просто не нашел нужных функций для чтения и записи)) А во втором - трудновоспроизводимую ошибку насчет ошибки обращения к такому-то адресу. | |
|
|
|
|
|
|
|
для: Киналь
(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!" | |
|
|
|
|
|
|
|
для: oleg_alexeev
(26.02.2007 в 10:49)
| | Спасибо за пример, почти все понял. Только два вопроса:
- чем отличается ifstream от ofstream и оба они от fstream?
- что означает строка out << str << endl? Точнее, ее вторая часть - << endl? | |
|
|
|
|
|
|
|
для: Киналь
(26.02.2007 в 19:18)
| | ifstream и ofstream - потомки fstream соответственно для ввода и вывода
endl - конец строки и очистка внутреннего буфера оъекта потока | |
|
|
|
|
|
|
|
для: Фитч
(26.02.2007 в 20:57)
| | >ifstream и ofstream - потомки fstream соответственно для ввода и вывода
То есть ofstream myfile - это то же, что и
fstream myfile;
myfile.open("c:\\test.txt", ios::out);
|
?
>endl - конец строки и очистка внутреннего буфера оъекта потока
Это, видимо, встроенная константа? | |
|
|
|
|
|
|
|
для: Киналь
(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 | |
|
|
|
|
|
|
|
для: Фитч
(27.02.2007 в 09:21)
| | короче, если в поток вбухать информацию, то он ее будет просто там хранить. А чтобы вся информация попала на экран, надо бухнуть в поток такую штуку, как endl. endl выводит на экран из потока все, что еще не было выведено. | |
|
|
|
|
|
|
|
для: Фитч
(27.02.2007 в 09:21)
| | Теперь все вроде ясно, спасибо!
Эх, сколько всего нужно изучать-то=) Библиотек-то фигова туча оказывается... | |
|
|
|