Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/155: Рейтинг темы: голосов - 155, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
1

Как при помощи ф-ий read/write записать в файл, а потом считать с него

12.03.2012, 23:03. Показов 32064. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Такой вопрос!
Как при помощи ф-ий read/write записать в файл, а потом считать с него различные типы данных, как int,double, char, char[5].
Заранее благодарен.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2012, 23:03
Ответы с готовыми решениями:

Как записать в файл и считать потом из него три массива с числами?
Доброго времени суток. Стоит такая задача: есть три динамических массива Y,Cr,Cb (n заранее не...

С помощью read и write записать массив структур в файл
Не могу с помощью системных вызовов read write записать массив структур в файл. Именно read write....

Как записать Md5 в файл и потом считать
Всем доброго времени суток, у меня такой вопрос у меня есть файл я получаю его MD5 как мне этот...

Win32: как записать односвязный список в файл, а потом его считать?
Добрый день. Подскажите, как записать односвязный список в файл, а потом его считать. Спасибо)

26
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.03.2012, 00:45 2
Вот пример, сначла записывается в файл данные потом считываются.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    char ch;
    int i;
    float f;
    char str[80];
 
    ofstream os("test.txt");
    if (!os) {
        cout << "Error. Can not open file!";
        return 1;
    }
 
    os << 10 << " " << 123.33 << endl;
    os << "This is a short text file";
    os.close();
 
 
    ifstream is("test.txt");
    if (!is) {
        cout << "Error. Can not open file!";
        return 1;
    }
 
    is >> i;
    is >> f;
    is >> ch;
    is >> str;
 
    cout << i << " " << f << " "<< ch << "\n";
    cout << str;
    is.close();
    return 0;
}
1
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
13.03.2012, 08:09  [ТС] 3
LostCoast,

Вот что написал я:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <string.h>
#include <iostream>
#include <stdio.h>
using namespace std;
 
    int a1,a11;
    long int a2,a22;
    short int a3,a33;
    float a4,a44;
    double a5,a55;
    char a6,a66;
    char a7[5],a77[5];
 
void Vvod();
void ZapFail(FILE *f2);
void ChitFail(FILE *f2);
int MENU(void);
 
int main()
{
    FILE *f2;
 
NACHALO:
    int g=MENU();
 
    switch (g)
    {
        case 1 : 
        { 
            Vvod();
            f2=fopen("str2.txt","w");
            ZapFail(f2);
            fclose(f2);
            f2=fopen("str2.txt","r");
            ChitFail(f2);
            fclose(f2);
            goto NACHALO;
        }
        case 2 : 
        {       
            remove("str2.txt");
            goto NACHALO;
        }
        default : break; 
    }       
          
    return 0;
} 
 
int MENU(void)
{
    int i;
    cout<<"1-zapis i chtenie | 2-udalenie"<<endl;
    cout<<"Vash vibor : ";
    cin>>i;
    return i;
}
 
void Vvod()
{
    cout<<"Vvedite <int> : ";
    cin>>a1;
    cout<<"Vvedite <long> : ";
    cin>>a2;
    cout<<"Vvedite <short> : ";
    cin>>a3;
    cout<<"Vvedite <float> : ";
    cin>>a4;
    cout<<"Vvedite <double> : ";
    cin>>a5;
    cout<<"Vvedite <char> : ";
    cin>>a6;
    cout<<"Vvedite <char[5]> : ";
    for (int i=0;i<5;i++)
        cin>>a7[i];
}
 
void ZapFail(FILE *f2)
{
    fprintf(f2,"%d\n",a1);
    fprintf(f2,"%ld\n",a2);
    fprintf(f2,"%hd\n",a3);
    fprintf(f2,"%.3f\n",a4);
    fprintf(f2,"%.3lf\n",a5);
        fprintf(f2,"%c\n",a6);
    fprintf(f2,"%s",a7);
}
 
void ChitFail(FILE *f2)
{
    fscanf(f2,"%d",&a11);
    cout<<"\n"<<a11;
    fscanf(f2,"%ld",&a22);
    cout<<"\n"<<a22;
    fscanf(f2,"%hd",&a33);
    cout<<"\n"<<a33;
    fscanf(f2,"%f",&a44);
    cout<<"\n"<<a44;
    fscanf(f2,"%lf",&a55);
    cout<<"\n"<<a55<<"\n";
    fscanf(f2,"%s",&a66);
    printf("%c\n",a66);
    fscanf(f2,"%s",a77);
    printf("%s",a77);
    cout<<"\n";
}
Но когда начинаю переделывать все под ybprjehjdytdst команды open, close, read, write - сразу куча ошибок..
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
13.03.2012, 09:14 4
C
1
2
3
4
5
6
7
8
9
10
11
FILE *fin,*fout;
fout=fopen("input.txt","wb");
double a[4]={1.2,3.4,5.6,7.8};
fwrite(a,sizeof(double),4,fout);
int b[5]={1,3,5,7,8};
fwrite(b,sizeof(int),5,fout);
fclose(fout);
fin=fopen("input.txt","rb");
fread(a,sizeof(double),4,fin);
fread(b,sizeof(int),5,fin);
fclose(fin);
Добавлено через 8 минут
Замечание, не смешивайте функции стандартного С (stdio.h)
и потокового вывода (iostream).
То, что в результате Вы сильно увеличиваете размер исполняемого файла
не столь важно. Но это может привести к неправильному функционированию
приложения, т.к. потоки будут пересекаться непредсказуемым способом.
0
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
13.03.2012, 11:03  [ТС] 5
zss2,
спасибо, я просил помощи по том, как записывать типы данных при помощи системной ф-ии read и считывать при помощи write..
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
13.03.2012, 11:24 6
функции read и write используются в библиотеке низкоуровневого ввода/вывода (io.h),
которая не рекомендуется для использования.
Вместо нее надо брать fread и fwrite из библиотеки stdio.h
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
13.03.2012, 11:31 7
Цитата Сообщение от Liv-pooL Посмотреть сообщение
записывать типы данных при помощи системной ф-ии read и считывать при помощи write..
наоборот
функцей-членом read()/write() можно считать/записать только строку.
Можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <cstdlib>
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    int x;
    ofstream fout("c:\\h.txt");     //Открыть файл для записи
    fout.write("723", 3);           //Записать в него число
    fout.close();                   //Закрыть файл
    ifstream fin("c:\\h.txt");      //Открыть файл для чтения
    fin >> x;                       //Считать из него число. В нашем случае 723
    fin.close();                    //Закрыть файл
    cout << x << endl;           //Вывести раннее записанную и считанную переменную x, уже в консоль для проверки
    system("PAUSE > NULL");
    return EXIT_SUCCESS;
}
Если конечно вам это надо.
1
Заблокирован
Автор FAQ
13.03.2012, 15:37 8
Бог мой сколько мыслей и все без просвета на то что действительно надо
1-е в Си существуют спецификаторы файлового ввода/вывода(аналогичные спецификаторам printf и scanf), на этом моменте останавливаться не буду и так понятно что fprintf("%d",5); пишет в файл целое, а fprintf("%lf",5); пишет вещественное, остановлюсь лучше именно на функциях read write что в Си что в плюсах
2 Си запись/чтение в файл с помощью fwrite/read
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
 
int main()
{
    int i_val;
    double d_val;
    char s_val[256] = {0};
    FILE * f = fopen("data.txt","w");
    if(!f)
        printf("Error open data.txt\n");
    else
    {
        printf("Enter int    : ");scanf("%d",&i_val);
        printf("Enter double : ");scanf("%lf",&d_val);
        printf("Enter char * : ");scanf("%s",s_val);
        fwrite((void *)&i_val,1,sizeof(i_val),f);
        fwrite((void *)&d_val,1,sizeof(d_val),f);
        fwrite((void *)&s_val,1,sizeof(s_val),f);
        fclose(f);
 
        if(!(f = fopen("data.txt","r")))
            printf("Error open data.txt\n");
        else
        {
            fread((void *)&i_val,1,sizeof(i_val),f);
            fread((void *)&d_val,1,sizeof(d_val),f);
            fread((void *)&s_val,1,sizeof(s_val),f);
            printf("Read int    : %d\n",i_val);
            printf("Read double : %lf\n",d_val);
            printf("Read char * : %s\n", s_val);
            fclose(f);
        }
    }
    printf("Press any key to continue\n");
    getchar();
    getchar();
    return 0;
}
3
Миниатюры
Как при помощи ф-ий read/write записать в файл, а потом считать с него  
2
Заблокирован
Автор FAQ
13.03.2012, 15:44 9
Цитата Сообщение от dimcoder Посмотреть сообщение
функцей-членом read()/write() можно считать/записать только строку.
- ты не прав - все пишет и всё читает, только нужно правильно реализовать...
3 С++ запись/чтение в файл с помощью fwrite/read
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    int i_val;
    double d_val;
    char s_val[256] = {0};
    fstream f;
    f.open("data.txt",ios::out);
    if(!f)
        cout<<"Error open data.txt\n";
    else
    {
        cout<<"Enter int    : ";cin>>i_val;
        cout<<"Enter double : ";cin>>d_val;
        cout<<"Enter char * : ";cin>>s_val;
        f.write((char *)&i_val,1);
        f.write((char *)&d_val,1);
        f.write((char *)&s_val,1);
        f.close();
        f.clear();
 
        f.open("data.txt",ios::in);
        if(!f)
            cout<<"Error open data.txt\n";
        else
        {
            f.read((char *)&i_val,1);
            f.read((char *)&d_val,1);
            f.read((char *)&s_val,1);
            cout<<"Read int    : "<<i_val<<endl;
            cout<<"Read double : "<<d_val<<endl;
            cout<<"Read char * : "<<s_val<<endl;
            f.close();
        }
    }
    system("pause");
    return 0;
}
Миниатюры
Как при помощи ф-ий read/write записать в файл, а потом считать с него  
1
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
13.03.2012, 22:43  [ТС] 10
-=ЮрА=-,
Юрий, спасибо, но мне необходимо использовать для работы с файлами только низкоуровнивые функции read, write, open и close.
Вот что я пока сделал:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
 
using namespace std;
 
    int a1,a11;
    long int a2,a22;
    short int a3,a33;
    float a4,a44;
    double a5,a55;
    char a6,a66;
    char a7[5],a77[5];
 
void Vvod();
int MENU(void);
 
int main()
{
    int f2;
    char buffer[30];
    char prob[1];
        prob[0]="";
 
NACHALO:
    int g=MENU();
    switch (g)
    {
        case 1 : 
        { 
            f2=open("111.txt",O_RDWR);
 
                        Vvod();
 
            int WRITE;
 
            sprintf(buffer,"%d",a1);
            WRITE=write(f2,buffer,strlen(buffer));
            sprintf(buffer,"%ld",a2);
            WRITE=write(f2,buffer,strlen(buffer));
            sprintf(buffer,"%hd",a3);
            WRITE=write(f2,buffer,strlen(buffer));
            sprintf(buffer,"%.3f",a4);
            WRITE=write(f2,buffer,strlen(buffer));
            sprintf(buffer,"%.3lf",a5);
            WRITE=write(f2,buffer,strlen(buffer));
                        buffer[0]=a6;
            WRITE=write(f2,buffer,sizeof(char));
                    WRITE=write(f2,a7,strlen(a7));
 
            if(close(f2)!=0)
                cout<<"Error close!\n";
            goto NACHALO;
        }
        case 2 : 
        {       
            remove("str2.txt");
            goto NACHALO;
        }
        default : break; 
    }
} 
 
int MENU(void)
{
    int i;
    cout<<"1-zapis i chtenie | 2-udalenie"<<endl;
    cout<<"Vash vibor : ";
    cin>>i;
    return i;
}
 
 
void Vvod()
{
    cout<<"Vvedite <int> : ";
    cin>>a1;
    cout<<"Vvedite <long> : ";
    cin>>a2;
    cout<<"Vvedite <short> : ";
    cin>>a3;
    cout<<"Vvedite <float> : ";
    cin>>a4;
    cout<<"Vvedite <double> : ";
    cin>>a5;
    cout<<"Vvedite <char> : ";
    cin>>a6;
    cout<<"Vvedite <char[5]> : ";
    for (int i=0;i<5;i++)
        cin>>a7[i];
}
Оно записывает, но все в одну строку, как можно разделить все по строкам и потом также считать, но используя именно read и write

Добавлено через 1 минуту
В общем поток по заданию использовать нельзя(((
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
14.03.2012, 11:56 11
эти функции предназначены для двоичного чтения-записи.
Не нужно данные преобразовывать в строки перед записью
C++
1
2
3
write(f2,&a1,sizeof(a1));
write(f2,&a2,sizeof(a2));
write(f2,&a3,sizeof(a3));
Аналогично при чтении данные непосредственно пересылаются в переменные.
C++
1
2
3
read(f2,&a1,sizeof(a1));
read(f2,&a2,sizeof(a2));
read(f2,&a3,sizeof(a3));
p.s. еще раз обращаю внимание, что io.h не рекомендуется использовать.
0
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
14.03.2012, 14:29  [ТС] 12
zss2,
Я понимаю, что не рекомендуется, но по заданию нужно..

Добавлено через 52 минуты
zss2,
оно просто так не писать нормально, не считывать не хочет. Пишет какимито иероглифами, считывает неизвестные числа...
0
-=ЮрА=-
14.03.2012, 14:52
  #13

Не по теме:

Цитата Сообщение от Liv-pooL Посмотреть сообщение
оно просто так не писать нормально, не считывать не хочет. Пишет какимито иероглифами, считывает неизвестные числа...
- ну если ты писал русским то он в файл будет кракозяброй писаться, цифры же будут писаться в двоичном режиме, в общем в файле не нужно ожидать увидеть вводимый текст на русском и цифры именно такими как мы привыкли их видеть

1
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
14.03.2012, 15:04  [ТС] 14
-=ЮрА=-,
я записываю в файл, переводя числа в строку, но оно пишет все одной строкой, как можно разделить построчно а потом по типам считать, или это не возможно при помощи write/read..

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
 
using namespace std;
 
        int a1,a11;
        long int a2,a22;
        short int a3,a33;
        float a4,a44;
        double a5,a55;
        char a6,a66;
        char a7[5],a77[5];
 
void Vvod();
int MENU(void);
 
int main()
{
        int f2;
        char buffer[30];
        char prob[1];
        prob[0]="";
 
NACHALO:
        int g=MENU();
        switch (g)
        {
                case 1 : 
                { 
                        f2=open("111.txt",O_RDWR);
 
                        Vvod();
 
                        int WRITE;
 
                        sprintf(buffer,"%d",a1);
                        WRITE=write(f2,buffer,strlen(buffer));
                        sprintf(buffer,"%ld",a2);
                        WRITE=write(f2,buffer,strlen(buffer));
                        sprintf(buffer,"%hd",a3);
                        WRITE=write(f2,buffer,strlen(buffer));
                        sprintf(buffer,"%.3f",a4);
                        WRITE=write(f2,buffer,strlen(buffer));
                        sprintf(buffer,"%.3lf",a5);
                        WRITE=write(f2,buffer,strlen(buffer));
                        buffer[0]=a6;
                        WRITE=write(f2,buffer,sizeof(char));
                        WRITE=write(f2,a7,strlen(a7));
 
                        if(close(f2)!=0)
                                cout<<"Error close!\n";
                        goto NACHALO;
                }
                case 2 : 
                {       
                        remove("str2.txt");
                        goto NACHALO;
                }
                default : break; 
        }
} 
 
int MENU(void)
{
        int i;
        cout<<"1-zapis i chtenie | 2-udalenie"<<endl;
        cout<<"Vash vibor : ";
        cin>>i;
        return i;
}
 
 
void Vvod()
{
        cout<<"Vvedite <int> : ";
        cin>>a1;
        cout<<"Vvedite <long> : ";
        cin>>a2;
        cout<<"Vvedite <short> : ";
        cin>>a3;
        cout<<"Vvedite <float> : ";
        cin>>a4;
        cout<<"Vvedite <double> : ";
        cin>>a5;
        cout<<"Vvedite <char> : ";
        cin>>a6;
        cout<<"Vvedite <char[5]> : ";
        for (int i=0;i<5;i++)
                cin>>a7[i];
}
0
-=ЮрА=-
14.03.2012, 15:10
  #15

Не по теме:

Хорошо Liv-pooL, сейчас посмотрю что к чему...

1
Заблокирован
Автор FAQ
14.03.2012, 15:33 16
Liv-pooL, я хоть и не рабоатл с io.h однако почти никаких отличий с С++ вариантом не нашёл, по сути функции представляют как бы смесь fwrite и fstream::write
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <io.h>
#include <fcntl.h>
using namespace std;
 
int main()
{
    int f;
    int i_val;
    double d_val;
    char s_val[256] = {0};
    f = open("data.txt",O_WRONLY);
    if(!f)
        cout<<"Error open data.txt\n";
    else
    {
        cout<<"Enter int    : ";cin>>i_val;
        cout<<"Enter double : ";cin>>d_val;
        cout<<"Enter char * : ";cin>>s_val;
        write(f,(void *)&i_val,sizeof(i_val));
        write(f,(void *)&d_val,sizeof(d_val));
        write(f,(void *)&s_val,sizeof(s_val));
        close(f);
        f = open("data.txt",O_RDONLY);
        if(!f)
            cout<<"Error open data.txt\n";
        else
        {
            read(f,(void *)&i_val,sizeof(i_val));
            read(f,(void *)&d_val,sizeof(d_val));
            read(f,(void *)&s_val,sizeof(s_val));
            cout<<"Read int    : "<<i_val<<endl;
            cout<<"Read double : "<<d_val<<endl;
            cout<<"Read char * : "<<s_val<<endl;
            close(f);
        }
    }
    system("pause");
    return 0;
}
Миниатюры
Как при помощи ф-ий read/write записать в файл, а потом считать с него  
0
Заблокирован
14.03.2012, 15:44 17
Liv-pooL, может стоит попробовать
Bash
1
2
3
4
5
man 2 read
man 2 write
man 2 open
man 2 close
man 2 lseek
-=ЮрА=-, тут речь не об СТЛ Си, тут сисколы юникс.
1
Заблокирован
Автор FAQ
14.03.2012, 15:48 18
Цитата Сообщение от alkagolik Посмотреть сообщение
тут сисколы юникс
- с учётом этого Liv-pooL, поясни под какую платформу пишем?
0
Заблокирован
14.03.2012, 15:51 19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- с учётом этого Liv-pooL, поясни под какую платформу пишем?
Как при помощи ф-ий read/write записать в файл, а потом считать с него
обрати внимание как записаны инклюды
0
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
14.03.2012, 16:05  [ТС] 20
-=ЮрА=-,
под Linux изучаем.
0
14.03.2012, 16:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2012, 16:05
Помогаю со студенческими работами здесь

Поместить ini-файл в ресурс (res) и потом считать из него данные
Доброго времени суток, уважаемые программисты! появилось необходимость поместить *.ini файл в...

Матрицу записать в файл, потом считать
Доброго времени суток! Нужно записать матрицу в файл и затем считать ее из файла в...

Создать файл,потом записать в него данные и вывести их на консоль
Не могу понять что я делаю не так.Программа должна создать файл,потом записать в него данные и...

Записать в файл данные для массива от записи, потом считать их
Выдает ошибку с кодом 106, когда пытается считать информацию из файла. Program LB8; {ђ*Ў®в* б...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru