Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
#1

Запись динамического массива в файл (не правильно выводит данные) - C++

10.07.2013, 22:11. Просмотров 1261. Ответов 33
Метки нет (Все метки)

Выделяю память под массив, заполняю его числами.

C++
1
2
3
4
5
6
7
8
9
10
11
    int *mem_arr;
    int i;
    int n = 50;
    mem_arr = (int *)malloc(n*sizeof(int));
    
    for(int i=0;i<6;i++)
    {
        printf("x[%d]=",i);
        scanf("%d",&mem_arr[i]);
    }
    free(mem_arr);
вывожу

C++
1
2
3
4
5
6
7
8
9
    ofstream file_out("c:/2.txt",ios::out);
    file_out << '\n';
    file_out << "Array R[6] = {"<<"\n";
    for(int c = 0; c < 6; c++)
    {
        file_out << dec << mem_arr[c] << "," << "\n";
    }
    file_out << "};" << '\n';
    file_out.close();
выводит не то, что я ввел.
помогите решить проблему.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    int z[5];
    printf("Input array's elements \n");
    int i;
        for(i=0;i<6;i++)
    {
        printf("x[%d]=",i);
        scanf("%d",&z[i]);
    }
 
    FILE *fp;
    fp = fopen("C:/1.txt","w");
    for(int c = 0; c < 6; c++)
    {
        fprintf(fp, "\n %d", z[c]);
    }
    fclose(fp);
так выводит все отлично.

Хотелось бы решить задачу, с выводом динамического массива и записью его в файл.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2013, 22:11     Запись динамического массива в файл (не правильно выводит данные)
Посмотрите здесь:

C++ Запись массива в файл.
C++ Запись массива в файл
Запись массива в файл C++
C++ Ошибка при выводе 1-го элемента массива, но правильно выводит последний
C++ Добавить запись в файл, который уже содержит данные
C++ Одна программа записывает данные в файл, а другая их считывает и выводит на экран
При передаче в функцию динамического массива, в массиве искажаются данные C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
10.07.2013, 22:17     Запись динамического массива в файл (не правильно выводит данные) #2
power12, сначала освобождаете память (free(mem_arr)), потом пользуетесь ею - надо наоборот, освобождать память, когда она уже не нужна.
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,469
10.07.2013, 22:21     Запись динамического массива в файл (не правильно выводит данные) #3
Цитата Сообщение от power12 Посмотреть сообщение
free(mem_arr);
все нет у тебя больше памяти
отобрала система
может и свое что нибудь написать
или указатель поскольку уже невалидный может в другое место указывать
soican
10.07.2013, 22:44
  #4

Не по теме:

не люблю малоки алоки, откуда они вообще такие взялись?!

ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,469
10.07.2013, 22:48     Запись динамического массива в файл (не правильно выводит данные) #5
Цитата Сообщение от soican Посмотреть сообщение
не люблю малоки алоки, откуда они вообще такие взялись?!
из Си
иногда даже очень необходимы
например выделить память без вызова конструктора
или есть еще такая штука realloc (с new такого не сделаешь)
перераспределить память
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
10.07.2013, 22:53  [ТС]     Запись динамического массива в файл (не правильно выводит данные) #6
, сначала освобождаете память (free(mem_arr)), потом пользуетесь ею - надо наоборот, освобождать память, когда она уже не нужна.
Спасибо , мой косячок, не заметил.
не люблю малоки алоки, откуда они вообще такие взялись?!
по-другому не умею пока)

знаю, что можно так, пробовал, не получается, если сможешь написать код через new и delete, буду благодарен
C++
1
2
3
int m_arr = new int[n];
...
delete []m_arr ;

Ребят, такой вопрос.
Вот мой массив в файле


Array R[4] = {
5,
6,
7,
8,
};

как удалить последнюю запятую, она тоже у меня в цикле.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
10.07.2013, 23:01     Запись динамического массива в файл (не правильно выводит данные) #7
Цитата Сообщение от power12 Посмотреть сообщение
знаю, что можно так, пробовал, не получается, если сможешь написать код через new и delete, буду благодарен
Код C++
1
2
3
int m_arr = new int[n];
...
delete []m_arr ;
C++
1
2
3
int * m_arr = new int[n];
...
delete[] m_arr;
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
10.07.2013, 23:56  [ТС]     Запись динамического массива в файл (не правильно выводит данные) #8
а как быть с выводом?
в txt записывается
Array R[4] = {
5,
6,
7,
8,
};
как убрать последнюю запятую?

C++
1
2
3
4
 for(int c = 0; c < 6; c++)
    {
        file_out << dec << mem_arr[c] << "," << "\n";
    }
надо что-то в выводе подправить?
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,469
11.07.2013, 00:01     Запись динамического массива в файл (не правильно выводит данные) #9
Цитата Сообщение от power12 Посмотреть сообщение
надо что-то в выводе подправить?
ну напиши так
C++
1
2
3
4
5
6
int c;
for(c = 0; c < 5; c++)
 {
  file_out << dec << mem_arr[c] << "," << "\n";
 }
file_out << dec << mem_arr[c] << "\n";
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
11.07.2013, 00:06  [ТС]     Запись динамического массива в файл (не правильно выводит данные) #10
Цитата Сообщение от ValeryS Посмотреть сообщение
ну напиши так
не не)) я про запятую, которая выводится в файл

что бы не было после 4ки

Array R[4] = {
1,
2,
3,
4,
};

что бы было

Array R[4] = {
1,
2,
3,
4
};

цикл например для 4х элементов
запятая тоже 4 раза выводится

что-то вроде c = cnt - 1 для запятой надо сделать, тогда она будет три раза выводится
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,469
11.07.2013, 00:10     Запись динамического массива в файл (не правильно выводит данные) #11
Цитата Сообщение от power12 Посмотреть сообщение
не не)) я про запятую, которая выводится в файл
А я тебе про что?
в цикле выводишь пять элементов с запятой
а потом после цикла шестой(последний) без запятой

и как у тебя получилось
Цитата Сообщение от power12 Посмотреть сообщение
for(int c = 0; c < 6; c++)
а в файле 4 цифры?
чей то ты недоговариваешь
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
11.07.2013, 00:15  [ТС]     Запись динамического массива в файл (не правильно выводит данные) #12
Цитата Сообщение от ValeryS Посмотреть сообщение
А я тебе про что?
в цикле выводишь пять элементов с запятой
а потом после цикла шестой(последний) без запятой

и как у тебя получилось

а в файле 4 цифры?
чей то ты недоговариваешь
C++
1
2
3
4
5
6
7
8
9
10
    ofstream file_out("c:/2.txt",ios::out);
    file_out << '\n';
    file_out << "Array R["<< cnt << "]" << " = {" <<"\n";
    for(int c = 0; c < cnt; c++)
    {
        file_out << dec << mem_arr[c] <<  "," << "\n";
    }
    file_out << "};" << '\n';
    file_out.close();
    free(mem_arr);
вот, массив динамич. элементы произвольно.

C++
1
2
3
4
5
6
int c;
for(c = 0; c < 5; c++)
 {
  file_out << dec << mem_arr[c] << "," << "\n";
 }
file_out << dec << mem_arr[c] << "\n";
а тут не получится так) из-за
C++
1
 mem_arr[c]
в последней строчке) массив же в цикле выводится
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,469
11.07.2013, 00:19     Запись динамического массива в файл (не правильно выводит данные) #13
на, пробуй
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ofstream file_out("c:/2.txt",ios::out);
file_out << '\n';
file_out << "Array R["<< cnt << "]" << " = {" <<"\n";
 
int c;
for(c = 0; c < cnt-1; c++)
{
file_out << dec << mem_arr[c] <<  "," << "\n";
}
file_out << dec << mem_arr[c]<< "\n";
 
file_out << "};" << '\n';
file_out.close();
free(mem_arr);
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
11.07.2013, 00:24  [ТС]     Запись динамического массива в файл (не правильно выводит данные) #14
Цитата Сообщение от ValeryS Посмотреть сообщение
на, пробуй
спасибо) только не пойму как он выводит

у нас же обращение идет по циклу(сколько элементов введено) и потом перебор всех элементов

C++
1
file_out << dec << mem_arr[c]<< "\n";
тут я завис...)
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,469
11.07.2013, 00:41     Запись динамического массива в файл (не правильно выводит данные) #15
Цитата Сообщение от power12 Посмотреть сообщение
тут я завис...)
смотри
переменная объявлена вне цикла
Цитата Сообщение от ValeryS Посмотреть сообщение
int c;
значит будет видна не только в цикле
дальше цикл на один меньше чем размер
Цитата Сообщение от ValeryS Посмотреть сообщение
for(c = 0; c < cnt-1; c++)
допустим нужно 6 элементов
цикл выводит пять
потом после цикла в c будет 5 (cnt-1)
это индекс последнего элемента
выводим его
Цитата Сообщение от ValeryS Посмотреть сообщение
file_out << dec << mem_arr[c]<< "\n";
здесь вся фишка в том что переменная цикла объявлена вне его, значит будет видна и после цикла
а значение у нее после цикла будет cnt-1

Добавлено через 4 минуты
это так маленькие хитрости
например нужно вывести пять элементов с запятой а еще пять точка с запятой
чтобы не мучатся с if пишем так

C++
1
2
3
4
5
6
7
8
9
int c=0;
for(; c < 5; c++)
{
file_out << dec << mem_arr[c] <<  "," << "\n";
}
for(; c < 10; c++)
{
file_out << dec << mem_arr[c] <<  ";" << "\n";
}
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.07.2013, 08:59     Запись динамического массива в файл (не правильно выводит данные) #16
Цитата Сообщение от ValeryS Посмотреть сообщение
из Си
иногда даже очень необходимы
например выделить память без вызова конструктора
В С++ для этого есть operator new.
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,469
11.07.2013, 09:31     Запись динамического массива в файл (не правильно выводит данные) #17
Цитата Сообщение от alsav22 Посмотреть сообщение
В С++ для этого есть operator new.
покажь
есть класс A
нужно выделить память под несколько экземпляров класса не вызывая при этом конструктор
переводить в char?
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.07.2013, 10:12     Запись динамического массива в файл (не правильно выводит данные) #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
class A
{
    int x;
public:
    A()
    {cout << "A" << endl;}
};
 
 
int main()
{
   void *p = operator new(2 * sizeof(A));
   
   system("pause");
}
Добавлено через 6 минут
http://www.cplusplus.com/reference/n...operator%20new

Добавлено через 13 минут
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
#include <iostream>
#include <cstdlib>
#include <new>
using namespace std;
 
class A
{
    int x;
public:
    A(int a)
    {
        x = a;
        cout << "A" << endl;
    }
    
    int get()
    {
        return x;
    }
};
 
 
int main()
{
   A *p = (A*)operator new(2 * sizeof(A));
   
   cout << "next" << endl;
   
   new(p)A(1);
   new(p + 1)A(2);
   
   cout << p ->get() << endl;
   cout << (p + 1) ->get() << endl;
   
   operator delete(p);
   
   system("pause");
   return 0;
}
Миниатюры
Запись динамического массива в файл (не правильно выводит данные)  
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
11.07.2013, 14:11     Запись динамического массива в файл (не правильно выводит данные) #19
я хочу понять зачем (A*) перед operator new(2 * sizeof(A)); в выражении
C++
1
A *p = (A*)operator new(2 * sizeof(A));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 14:22     Запись динамического массива в файл (не правильно выводит данные)
Еще ссылки по теме:

C++ Запись массива в файл
C++ Программа выводит в окне диаграмму динамического массива данных
Как правильно сохранить данные массива C++
Чтение и запись в файл динамического массива классов C++
Не правильно выводит произведение элементов массива кратных 3-ем, между мин. и макс C++

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
11.07.2013, 14:22     Запись динамического массива в файл (не правильно выводит данные) #20
Цитата Сообщение от soican Посмотреть сообщение
я хочу понять зачем (A*) перед operator new(2 * sizeof(A)); в выражении
Код C++
1
A *p = (A*)operator new(2 * sizeof(A));
operator new возвращает void *, поэтому нужно приведение типа.
"По хорошему" там надо ещё самому деструкторы вызывать перед освобождением памяти...
Yandex
Объявления
11.07.2013, 14:22     Запись динамического массива в файл (не правильно выводит данные)
Ответ Создать тему
Опции темы

Текущее время: 20:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru