Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в файл!!! 
:(
    Опции темы
Fighter
Дата 11.5.2005, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



До сих пор я не встретил ни одной книжки в которой внятно объясняется как работать с файлами и поэтому решил обратиться сюда. Меня больше интересует запись и считывание из файла используя функции open, creat, read, write. В книгах начинают писать про буферы-фуферы и т.д.

Вопрос в тык. Вот у меня есть исходник!

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
****


int main()
{
int a;
char* b;
***
cin >> a;
cin >> b;

***
return 0;
}

Как мне теперь организовать запись в файл, используя функции read write open close creat? Приведите исходник.
И кстати, можно ли структуры целиком сохранять. Например,

struct person_info {
int age;
char* name;
};

int main()
{
person_info pi;
write(handle, &pi, sizeof(person_info));
}

вот так?
PM MAIL   Вверх
HELPER
Дата 11.5.2005, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 18.4.2005

Репутация: -2
Всего: -2




Цитата(Fighter @ 11.5.2005, 05:23)
struct person_info {
int age;
char* name;
};

int main()
{
person_info pi;
write(handle, &pi, sizeof(person_info));
}

вот так?


только pi без омперсанта, а что не работает???
PM MAIL   Вверх
HELPER
Дата 11.5.2005, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 18.4.2005

Репутация: -2
Всего: -2



айай! сорри, спутал с fread...
PM MAIL   Вверх
kometa_triatlon
Дата 11.5.2005, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 2
Всего: 6



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

FILE *stream ;
int buffer;
if(!(stream=fopen("FILE.DAT","r"))) {    
        cerr<<"error opening file.";
        getch();
        exit(1);
    }
else{
        while(!feof(stream)){        
                fread(&buffer,sizeof(int),1,stream);
                                    cout<<buffer<<" ";
        }
    }
    fclose(stream);            

Запись в файл:

Код

char answer;
int data;
if ((stream=fopen("FILE.DAT","w"))==NULL){    
        cerr<<"Error opening file.";
        getch();
        exit(1);
    }
    else {
        do {
            cin>>data;                
            fwrite(&data,sizeof(int),1,stream);    
            fflush(stdin);                        
            cout<<"Input one more time? [y/n]: "; cin>>answer;
        } while (answer=='y');
        fclose(stream);            

Цитата
И кстати, можно ли структуры целиком сохранять

Можно. Просто определяешь свою структуру, затем подставляешь этот тип в sizeof()


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Fighter
Дата 11.5.2005, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



Цитата(kometa_triatlon @ 11.5.2005, 14:12)
Итак, создаем файл, открываем на чтение. Пусть там будут данные типа int

Код
FILE *stream ;
int buffer;
if(!(stream=fopen("FILE.DAT","r"))) {    
        cerr<<"error opening file.";
        getch();
        exit(1);
    }
else{
        while(!feof(stream)){        
                fread(&buffer,sizeof(int),1,stream);
                                    cout<<buffer<<" ";
        }
    }
    fclose(stream);            


Запись в файл:

Код
char answer;
int data;
if ((stream=fopen("FILE.DAT","w"))==NULL){    
        cerr<<"Error opening file.";
        getch();
        exit(1);
    }
    else {
        do {
            cin>>data;                
            fwrite(&data,sizeof(int),1,stream);    
            fflush(stdin);                        
            cout<<"Input one more time? [y/n]: "; cin>>answer;
        } while (answer=='y');
        fclose(stream);            



Цитата
И кстати, можно ли структуры целиком сохранять

Можно. Просто определяешь свою структуру, затем подставляешь этот тип в sizeof()


Спасибо за это. А еще как с помощью open creat write и read а не с помощью fopen fread fwrite?
PM MAIL   Вверх
Fighter
Дата 11.5.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



kometa_triatlon
Кстати, спасибо. Это очень удобный способ записи в файл. Но почему он не записывает в файл переменные типа char*.

Это сообщение отредактировал(а) Fighter - 11.5.2005, 21:39
PM MAIL   Вверх
kometa_triatlon
Дата 11.5.2005, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 2
Всего: 6



Цитата
open creat write и read

Я чего-то не пойму о чем ты... Первый раз слышу о таких функциях.

А насчет строк... Ну попробуй использовать char[<длина строки>]. Все же указатель - понятие растяжимое smile.
Или сделай
typedef char[255] MyType;
и используй MyType


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
gepard
Дата 12.5.2005, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



Вот как надо работать с файлами:
Код

...
FILE* file = fopen("file.txt", "w");
char chr[256] = {""};
fprintf(file, "Hello World!");
fclose(file);
file = fopen("file.txt", "r");
fscanf(file, "%s", chr)
fclose(file);
printf("%s", chr);
...



--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Fighter
Дата 12.5.2005, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



Цитата(kometa_triatlon @ 11.5.2005, 22:12)
А насчет строк... Ну попробуй использовать char[<длина строки>]. Все же указатель - понятие растяжимое .
Или сделай
typedef char[255] MyType;
и используй MyType


Спасибо за идею. Только вот я typedef не использую. Я сразу в структуре пишу char name1[255]. Вот я привожу код, где все работает.


Код

// WriteFile.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>






using namespace std;

struct person_info {
    int age;
    char name;
    char name1[255];
};


int main(int argc, char* argv[])
{
    person_info pi;
    FILE *fp;
    int bytes = 0;
    char operation;



    for (;;) {
        cout<<"\nX - exit, W - write to file, R - read from file\n";
        cout<<"Enter operation ";
        cin >> operation;
        if ((operation == 'X') || (operation == 'x')) {
            break;
        }
        if ((operation == 'W') || (operation == 'w')) {
            cout<<"Enter Name ";
            cin >> pi.name;
            cout<<"Enter Name1 ";
            cin >> pi.name1;
            cout<<"Enter Age ";
            cin >> pi.age;
            fp = fopen("c:\\File.dat", "w");
                bytes = fwrite(&pi, sizeof(person_info), 1, fp);
            fclose(fp);
            cout<<"\n" << bytes << " bytes written";            
        }
        if ((operation == 'R') || (operation == 'r')) {
            fp = fopen("c:\\File.dat", "r");
                bytes = fread(&pi, sizeof(person_info), 1, fp);
            fclose(fp);
            cout<<"Name = " << pi.name << endl;
            cout<<"Name1 = " << pi.name1 <<endl;
            cout<<"Age = " << pi.age << endl;
            cout<<bytes << " bytes read";
        }
    }

    return 0;
}


Добавлено @ 05:02
Еще раз спасибо.
PM MAIL   Вверх
AISIN
Дата 12.5.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 27.1.2005
Где: Пушкино

Репутация: нет
Всего: 1



Цитата(kometa_triatlon @ 11.5.2005, 22:12)
Цитата
open creat write и read

Я чего-то не пойму о чем ты... Первый раз слышу о таких функциях.

в фортране такие функции попадаются например
Код

 open(1,file='a.txt')
 a=0;
 write(1,'(5f8.2)')a

ну напиши свои функции open , write и т. д. Внутри которых будешь все равно использовать, что то типа fopen и т. д.
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002%
PM MAIL   Вверх
Fixin
Дата 12.5.2005, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Цитата
Я чего-то не пойму о чем ты... Первый раз слышу о таких функциях
Такие описываются в ostream.h, io.h, fstream.h. А вот о каких именно... это совсем другая история. Я, вообще подумал сначала, что он говорит про fopen, fgetx, fputx.
PM MAIL ICQ   Вверх
kometa_triatlon
Дата 12.5.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 2
Всего: 6



Если вы имеете ввиду методы классов ifsteam, ofstream так это же отдельный разговор...


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
AISIN
Дата 12.5.2005, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 27.1.2005
Где: Пушкино

Репутация: нет
Всего: 1



Код

#include<fstream.h>

class A
{
public:
    A(int weight, long d):itsWeight(weight),itsD(d){}
    ~A(){}
    int GetWeight()const{return itsWeight;}
private:
    int itsWeight;
    long itsD;
};

int main()
{
    char file[80];
    cout<<"ВВеди имя файла";
    cin>>file;
    ofstream fout(file,ios::binary);
    if(!fout)
    {
        cout<<"Огоо! чтото не получилось с файлом!\n";
        return(1);
    }
    A B(50,100);
    fout.write((char*)&B,sizeof(B));
    fout.close();
    ifstream fin(file,ios::binary);
    if(!fin)
    {
        cout<<"CCCтранно но файл не открыт\n";
        return(1);
    }
    A B2(1,1);
    cout<<B2.GetWeight()<<endl;
    fin.read((char*)&B2,sizeof(B2));
    fin.close();
    return(0);
}

Вот так вот!
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002%
PM MAIL   Вверх
kometa_triatlon
Дата 13.5.2005, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 2
Всего: 6



Ну это ты работаешь с потоками, надо было с этого и начинать...
Код

if(!fout)    
    {    
        cerr<<"Огоо! чтото не получилось с файлом!\n";    
        return(1);    
    }

smile Так правильнее smile


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0661 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.