Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 68, средняя оценка - 4.68
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
#1

Нужно записать массив в файл, а потом из этого файла считать этот же массив - C++

30.01.2009, 12:56. Просмотров 8404. Ответов 12
Метки нет (Все метки)

Помогите, пожалуйста, никогда с файлами делов не имела.
Нужно записать массив в файл, а потом из этого файла считать этот же массив.
Как это сделать на чистом Си?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2009, 12:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужно записать массив в файл, а потом из этого файла считать этот же массив (C++):

Считать из этого файла какой-либо символ и записать этот символ в новый файл - C++
здравствуйте , помогите с решением следующего задания: естьтекстовый файл vvod.txt, в нем записана строка. мне нужно считать из этого...

Сохранить массив в файл а потом считать его из файла - C++
#include <iostream> using namespace std; int main() { setlocale (0,""); const int str = 10; const int stolb = 10; int...

Как из массива записать объекты в файл, а потом из файла в другой массив ? - C++
Подскажите как с помощью ofstream, ifstream, ios::binary надо записывать объекты в файл и читать их оттуда.

Считать массив из файла, записать результаты в другой файл - C++
Программа рабочая, нужно переделать, так чтобы массив считывался из файла и сумма со средним арифметическим выводилась, и на экран, и в...

Массив считать из файла, отсортировать по возрастанию и записать в новый файл - C++
Создаем текстовый файл из num строК, каждая строка содержит трехразрядное число сгенерированное, далее функция читает содержимое файла в...

Записать файл в массив, а потом его раскидать - C++
есть файл: 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 10 10 10 10

12
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
30.01.2009, 13:09 #2
vecprint.c
C++
1
2
3
4
5
6
7
8
9
10
11
 
#include <stdio.h> 
 
/* vecprint: выводит вектор v длины n в файл ofp */ 
int *vecprint(int *v, int n, FILE *ofp)
{
    while (n--)
        fprintf(ofp, " %d%s",
            *v++, (n == 0 ? "\n" : ""));
    return ferror(ofp) ? NULL : v;
}
vecfill.c
C++
1
2
3
4
5
6
7
8
9
10
11
12
 
#include <stdio.h> 
 
/* vecfill:  заполняет вектор v длины n данными из файла ifp */ 
int *vecfill(int *v, int n, FILE *ifp)
{
    int *vp;
    
    for (vp = v; n > 0 && fscanf(ifp, "%d", vp++) == 1; n--)
        ;
    return ferror(ifp) ? NULL : v;    
}
0
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
30.01.2009, 13:25  [ТС] #3
подскажите, что у меня здесь не правильно? Компилируется, но в файл ничего не записывает...
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define true 1
#define false 0
 
 
//выводит вектор a длины n в файл fp 
unsigned int *vecprint(unsigned int *a, unsigned int n, FILE *fp)  
{  
    while (n--)  
        fprintf(fp, " %d%s",  
            *a++, (n == 0 ? "\n" : ""));  
    return ferror(fp) ? NULL : a;  
} 
 
 
// заполняет вектор a длины n данными из файла fp   
unsigned int *vecfill(unsigned int *a, unsigned int n, FILE *fp)  
{  
    unsigned int *vp;  
      
    for (vp = a; n > 0 && fscanf(fp, "%d", vp++) == 1; n--)  
        ;  
    return ferror(fp) ? NULL : a;      
}  
 
 
int main(void){
 
    //создать текстовый файл для чтения/записи
    FILE *fp;
    unsigned int n=615;  // Текущее количество найденных простых чисел
    unsigned int k;  // Текущее количество найденных простых чисел
    unsigned int *a; // Указатель на массив найденных простых
    unsigned int p;  // Очередное проверяемое число
    unsigned int r;  // Целая часть квадратного корня из p
    unsigned int i;  // Индекс простого делителя
    unsigned int prime; // Признак простоты
        
    if ((fp = fopen("test.txt", "w+")) == NULL)
 
        {
 
        printf("Error open file");
 
        exit(1);
 
        }
 
 
    if (n <= 0)   // Некорректное значение =>
        return 1; // завершаем работу с кодом ошибки
 
    // Захватываем память под массив простых чисел
    a = (unsigned int *) malloc(n * sizeof(unsigned int));
 
    a[0] = 2; k = 1;     // Добавляем двойку в массив
   
    p = 3;
    while (k < n) {
 
        // Проверяем число p на простоту
        r = (unsigned int)(               // Целая часть корня
            sqrt((double) p) + 0.001
        );
        i = 0;
 
        prime = true;
        while (i < k && a[i] <= r) {
            if (p % a[i] == 0) { // p делится на a[i]
                prime = false;   // => p не простое,
                break;           // выходим из цикла
            }
            ++i; // К следующему простому делителю
        }
 
        if (prime) {  // Если нашли простое число,
            a[k] = p; // то добавляем его в массив
            ++k;      // Увеличиваем число простых    
        }
 
        p += 2; // К следующему нечетному числу
    }
  
 
  
        for(k=0; k<n; k++){
        printf("%d ", a[k]); // Печатаем простое число  
        }
 
    vecprint(&a, n, &fp);  
 
    
    //закрыть файл
    fclose(fp);
 
    }
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
30.01.2009, 13:30 #4
не надо адрес fp передавать, надо передавать значение из fp

Код
    vecprint(a, n, fp);
0
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
30.01.2009, 14:54  [ТС] #5
тогда в файле вот такое вот сплошные квадратики - это нормально?

Добавлено через 4 минуты 33 секунды
и когда добавляю в конец

C++
1
2
3
4
5
    vecfill(b, n, fp);
 
    for(k=0; k<n; k++){
        printf("%d ", b[k]); // Печатаем простое число  
        }
то инструкция обратилась по адресу....память не может быть прочитана...

Добавлено через 4 минуты 14 секунд
а когда так - то работает....
C++
1
2
3
4
5
6
7
8
9
10
11
12
    vecprint(a, n, fp);  
 
    vecfill(a, n, fp);
 
    for(k=0; k<n; k++){
        printf("%d ", a[k]); // Печатаем простое число  
        }
 
    //закрыть файл
    fclose(fp);
 
    }
так и должно быть?

Добавлено через 19 минут 1 секунду
и еще, подскажите, пожалуйста, как можно сделать так, чтобы нумерация в моем массиве a[k] простых чисел начиналась не с 0, а с 1??
т.е., что a[1]=2, a[2]=3 и т.д.? Буду очень благодарна!
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
30.01.2009, 16:24 #6
vecprint.c
C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h> 
 
/* vecprint: выводит вектор v длины n в файл ofp */ 
int *vecprint(int *v, int n, FILE *ofp)
{
    while (n--)
        fprintf(ofp, " %d%s",
            *v++, (n == 0 ? "\r\n" : ""));
    return ferror(ofp) ? NULL : v;
}
тут для виндовс для notepad.exe

массива b не наблюдаю, потому всё правильно пишет

чтобы нумерация в моем массиве a[k] простых чисел начиналась не с 0, а с 1?
первый элемент останется в массиве, т.е. если делать нумерацию с 1, это будет второй элемент (и потом при обработке массива нужно будет передавать его начиная со второго элемента типа a+1)
так то, если элементы правильно пишутся
Код
    for (i = 1; i <= n; i++);
        printf("%d\n", a[i-1]);
здесь перед \n можно не ставить \r, т.к. консоль в виндовс развилась

иначе массив надо создавать на один элемент больше, если нулевой будет болтаться
0
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
30.01.2009, 16:29  [ТС] #7
а что здесь не правильно? Т.е. почему нельзя сделать как отдельную функцию создание и запись в файл, а потом его читать...или я опять чего-то не понимаю?

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
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define true 1
#define false 0
 
//выводит вектор a длины n в файл fp 
unsigned int *vecprint(unsigned int *a, unsigned int n, FILE *fp)  
{  
    while (n--)  
        fprintf(fp, " %d%s",  
            *a++, (n == 0 ? "\n" : ""));  
    return ferror(fp) ? NULL : a;  
} 
 
 
// заполняет вектор a длины n данными из файла fp   
unsigned int *vecfill(unsigned int *a, unsigned int n, FILE *fp)  
{  
    unsigned int *vp;  
      
    for (vp = a; n > 0 && fscanf(fp, "%d", vp++) == 1; n--)  
        ;  
    return ferror(fp) ? NULL : a;      
}  
 
 
int createfile(){
 
    //создать текстовый файл для чтения/записи
    FILE *fp;
    unsigned int n=615;  // Текущее количество найденных простых чисел
    unsigned int k;  // Текущее количество найденных простых чисел
    unsigned int *a; // Указатель на массив найденных простых
    unsigned int p;  // Очередное проверяемое число
    unsigned int r;  // Целая часть квадратного корня из p
    unsigned int i;  // Индекс простого делителя
    unsigned int prime; // Признак простоты
        
    if ((fp = fopen("test.txt", "w+")) == NULL)
 
        {
 
        printf("Error open file");
 
        exit(1);
 
        }
 
 
    if (n <= 0)   // Некорректное значение =>
        return 1; // завершаем работу с кодом ошибки
 
    // Захватываем память под массив простых чисел
    a = (unsigned int *) malloc(n * sizeof(unsigned int));
 
    a[0] = 2; k = 1;     // Добавляем двойку в массив
   
    p = 3;
    while (k < n) {
 
        // Проверяем число p на простоту
        r = (unsigned int)(               // Целая часть корня
            sqrt((double) p) + 0.001
        );
        i = 0;
 
        prime = true;
        while (i < k && a[i] <= r) {
            if (p % a[i] == 0) { // p делится на a[i]
                prime = false;   // => p не простое,
                break;           // выходим из цикла
            }
            ++i; // К следующему простому делителю
        }
 
        if (prime) {  // Если нашли простое число,
            a[k] = p; // то добавляем его в массив
            ++k;      // Увеличиваем число простых    
        }
 
        p += 2; // К следующему нечетному числу
    }
 
    vecprint(a, n, fp);  
 
    //закрыть файл
    fclose(fp);
 
return 0;
 
    }
 
int main(){
 
   
    FILE *fp;
    unsigned int k,n;  // Текущее количество найденных простых чисел
    unsigned int *a; // Указатель на массив найденных простых
    createfile();
    if ((fp = fopen("test.txt", "r")) == NULL)
 
        {
 
        printf("Error open file");
 
        exit(1);
 
        }
 
    vecfill(a, n, fp);
 
    for(k=0; k<n; k++){
 
        printf("%d ", a[k]); // Печатаем простое число  
        
    }
}
0
Фенрир
42 / 38 / 2
Регистрация: 05.01.2009
Сообщений: 394
30.01.2009, 16:42 #8
в функцию CreateFile нужно передавать теперь указатель на файл.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
30.01.2009, 16:45 #9
большие функции нельзя делать, это равно тому, если вообще функций не делать а писать в одной функции всю программу, и глобальные переменные тоже нельзя делать, т.к. функции начинают от них зависеть и их невозможно переносить в новые программы из-за этого
если программа выдаст Error open file, не сможешь определить какой именно, вместо первой ошибки Error create file, потому что в случае отсутствия файла она его создаст
тут напрашивается глобальный указатель a, но я уже сказал
- создаёшь файл
- создаёшь вектор
- заполняеш вектор простыми числами
- пишешь вектор в файл
- выводишь вектор на экран

вместо вот этого
Код
    for(k = 0; k < n; k++)
        printf("%d ", a[k]); // Печатаем простое число
это
Код
    vecprint(a, n, stdout);
0
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
30.01.2009, 17:00  [ТС] #10
accept, дело в том, что мне нужно многократно в разных частях программы использовать простые числа (либо первые 10 чисел из моего массива, который я сформировала, либо 55 чисел и т.д.) именно поэтому, нужно было создать файл с максимальным числом простых, которые мне могут понадобиться, чтобы не генерировать каждый раз массивы различной длины заново.

вроде это выполнено?
"- создаёшь файл
- создаёшь вектор
- заполняеш вектор простыми числами
- пишешь вектор в файл
- выводишь вектор на экран"

только мне не нужно выводить эти числа на экран - мне нужно использовать их в других функциях и неоднократно.

Не знаю, как это по другому сделать....Может можно вообще обойтись без файла? А просто сгенерировать массив и им напрямую пользоваться? Но я не знаю как запрограммировать, чтобы моя функция вернула мне массив?? Чтобы я могла потом им пользоваться? Может подскажете? Пожалуйста!

C++
1
  vecprint(a, n, stdout);
- а так все равно выдает ошибку выделения памяти

Добавлено через 3 минуты 31 секунду
Фенрир, как раз функция CreateFile свою работу делает, создает файл с простыми числами..
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
30.01.2009, 17:22 #11
a должна быть массивом, а n не больше количества элементов в нём

- создаёшь вектор
- заполняешь вектор простыми числами (передаёшь его и его длину в функцию, если она его заполнила, возвращает его адрес обратно, если нет NULL)
- используешь вектор по той же технологии
- освобождаешь вектор из памяти

veccreat.c
C++
1
2
3
4
5
6
7
8
 
#include <stdlib.h>
 
/* veccreat:  создаёт вектор длины n */ 
int *veccreat(int n)
{
    return (int *) calloc(n, sizeof(int));
}
vecfree.c
C++
1
2
3
4
5
6
7
8
 
#include <stdlib.h> 
 
/* vecfree:  удаляет вектор v из памяти */ 
void vecfree(int *v)
{
    free((void *) v);
}
значит делаешь базовый вектор, который заполняешь числами
и маленький вектор в который потом читаешь нужный набор из базового, маленький вектор передаёшь в функции, если нельзя передать там кусок базового (это делается через начало базового и длину до которой читать)
освобождать нужно всё что было выделено

Добавлено через 10 минут 36 секунд
пример записи векторов
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 *vecprint(int *v, int n, FILE *ofp);
int *vecfill(int *v, int n, FILE *ifp);
 
/* выводит векторы программы и ввода в файл */
main()
{
    FILE *fp;
    int n[] = { 1, 2, 3, 4, 5 };
    
    if ((fp = fopen("out.txt", "wb")) == NULL)
        return 1;
    vecprint(n, sizeof n / sizeof n[0], fp);
    vecfill(n, sizeof n / sizeof n[0], stdin);
    vecprint(n, sizeof n / sizeof n[0], fp);
    return 0;
}
 
/* vecprint: выводит вектор v длины n в файл ofp */ 
int *vecprint(int *v, int n, FILE *ofp)
{
    while (n--)
        fprintf(ofp, " %d%s",
            *v++, (n == 0 ? "\r\n" : ""));
    return ferror(ofp) ? NULL : v;
}
 
/* vecfill:  заполняет вектор v длины n данными из файла ifp */ 
int *vecfill(int *v, int n, FILE *ifp)
{
    int *vp;
    
    for (vp = v; n > 0 && fscanf(ifp, "%d", vp++) == 1; n--)
        ;
    return ferror(ifp) ? NULL : v;    
}
0
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
30.01.2009, 17:41  [ТС] #12
а - и есть массив, n - максимальное количество элементов в нем.
Зачем вектора создавать? Мне просто нужен один массив, а я по желанию буду просто использовать не все его элементы....вопрос в том, КАК СДЕЛАТЬ ТАК, ЧТОБЫ ФУНКЦИЯ ВЕРНУЛА МАССИВ? "если она его заполнила, возвращает его адрес обратно, если нет NULL".
Адрес массива...НО КАК ЕГО ПОТОМ ИСПОЛЬЗОВАТЬ???
Вот функция.
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
///////////////////////////////////////////////////////////////////
//генерация первых 615 простых чисел и записываем их в массив
int generation_zadannogo_colichestva_prostyx(unsigned int n) {
    unsigned int k;  // Текущее количество найденных простых чисел
    unsigned int *a; // Указатель на массив найденных простых
    unsigned int p;  // Очередное проверяемое число
    unsigned int r;  // Целая часть квадратного корня из p
    unsigned int i;  // Индекс простого делителя
    unsigned int prime; // Признак простоты
 
    if (n <= 0)   // Некорректное значение =>
        return 1; // завершаем работу с кодом ошибки
 
    // Захватываем память под массив простых чисел
    a = (unsigned int *) malloc(n * sizeof(unsigned int));
 
    a[0] = 2; k = 1;     // Добавляем двойку в массив
   // printf("%d ", a[0]); // и печатаем ее
 
    p = 3;
    while (k < n) {
 
        // Проверяем число p на простоту
        r = (unsigned int)(               // Целая часть корня
            sqrt((double) p) + 0.001
        );
        i = 0;
        prime = true;
        while (i < k && a[i] <= r) {
            if (p % a[i] == 0) { // p делится на a[i]
                prime = false;   // => p не простое,
                break;           // выходим из цикла
            }
            ++i; // К следующему простому делителю
        }
 
        if (prime) {  // Если нашли простое число,
            a[k] = p; // то добавляем его в массив
            ++k;      // Увеличиваем число простых
           // printf("%d ", p); // Печатаем простое число
            //if (k % 5 == 0) { // Переход на новую строку
             //   printf("\n"); // после каждых пяти чисел
           // }
        }
 
        p += 2; // К следующему нечетному числу
    }
 
    //if (k % 5 != 0) {
     //   printf("\n"); // Перевести строку
   // }
 
    // Освобождаем динамическую память
    //free(a);
    return a;
}
///////////////////////////////////////////////////////////////////
Она возвращает указатель на массив? Правильно я понимаю? Если нет, то как сделать, чтобы возвращала указатель на массив? И как этот указатель потом использовать? Например, как вывести этот массив на экран?

Добавлено через 12 минут 56 секунд
я прошу прощения, за то, что ужасно туплю здесь сейчас. Я все поняла наконец-то
accept, СПАСИБО ОГРОМНОЕ за помощь и терпение!
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
30.01.2009, 18:05 #13
да они почти все указатель на массив возвращают, кроме vecfree

Код
unsigned *generation_zadannogo_colichestva_prostyx(unsigned n);
если у массива тип unsigned int (это то же самое что unsigned), то и указатель должен хранить адрес по которому хранится значение такого же типа (unsigned *)
0
30.01.2009, 18:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2009, 18:05
Привет! Вот еще темы с ответами:

Считать из файла и записать массив - C++
вопрос в комментарии, подскажите пожалуйста #include &lt;iostream&gt; using namespace std; struct book { string name; int year; ...

Заполнить динамический массив из файла и записать массив обратно в файл - C++
Подскажите пожалуйста функцию которая будет заполнять Динамический массив из файла и обратную которая этот массив запишет в файл=)

Считать числа из файла и записать их в массив - C++
Проблема следущая: нужна программа которая считывает числа типа double из файла (в моем случае это индексы валютного курса) и записывает их...

Записать массив double в файл, и считать его - C++
Допустим есть массив double *pdArrayOfAllWeight = (double*)malloc(sizeof(double)*iSumAllWeight); Как записать этот массив в файл, не...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.