Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
power12
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 100
1

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

10.07.2013, 22:11. Просмотров 1469. Ответов 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);
так выводит все отлично.

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

Чтение и запись в файл динамического массива классов
Здравствуйте! Столкнулся с проблемой во время написания программы, которая...

Программа выводит в окне диаграмму динамического массива данных
Можете создать программу которая выводит в окне диаграмму динамического массива...

Запись и удаление элемента динамического массива
Приветствую всех форумчан (я наверное всем надоел, знаю, но помогите, плз :D) ...

Запись и удаление элемента динамического массива
Такое дело: при вызове функции удаления набранной юзэром ячейки динамического...

Файл: Не выводит данные из файла
Здравствуйте. Задание в целом выглядит следующим образом: создать матрицу 5х5 с...

33
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
10.07.2013, 22:17 2
power12, сначала освобождаете память (free(mem_arr)), потом пользуетесь ею - надо наоборот, освобождать память, когда она уже не нужна.
1
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,944
10.07.2013, 22:21 3
Цитата Сообщение от power12 Посмотреть сообщение
free(mem_arr);
все нет у тебя больше памяти
отобрала система
может и свое что нибудь написать
или указатель поскольку уже невалидный может в другое место указывать
0
soican
10.07.2013, 22:44
  #4

Не по теме:

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

0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,944
10.07.2013, 22:48 5
Цитата Сообщение от soican Посмотреть сообщение
не люблю малоки алоки, откуда они вообще такие взялись?!
из Си
иногда даже очень необходимы
например выделить память без вызова конструктора
или есть еще такая штука realloc (с new такого не сделаешь)
перераспределить память
0
power12
6 / 6 / 7
Регистрация: 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,
};

как удалить последнюю запятую, она тоже у меня в цикле.
0
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 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;
1
power12
6 / 6 / 7
Регистрация: 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";
    }
надо что-то в выводе подправить?
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,944
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";
0
power12
6 / 6 / 7
Регистрация: 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 для запятой надо сделать, тогда она будет три раза выводится
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,944
11.07.2013, 00:10 11
Цитата Сообщение от power12 Посмотреть сообщение
не не)) я про запятую, которая выводится в файл
А я тебе про что?
в цикле выводишь пять элементов с запятой
а потом после цикла шестой(последний) без запятой

и как у тебя получилось
Цитата Сообщение от power12 Посмотреть сообщение
for(int c = 0; c < 6; c++)
а в файле 4 цифры?
чей то ты недоговариваешь
0
power12
6 / 6 / 7
Регистрация: 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]
в последней строчке) массив же в цикле выводится
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,944
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);
1
power12
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 100
11.07.2013, 00:24  [ТС] 14
Цитата Сообщение от ValeryS Посмотреть сообщение
на, пробуй
спасибо) только не пойму как он выводит

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

C++
1
file_out << dec << mem_arr[c]<< "\n";
тут я завис...)
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,944
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";
}
0
alsav22
5445 / 4840 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.07.2013, 08:59 16
Цитата Сообщение от ValeryS Посмотреть сообщение
из Си
иногда даже очень необходимы
например выделить память без вызова конструктора
В С++ для этого есть operator new.
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,944
11.07.2013, 09:31 17
Цитата Сообщение от alsav22 Посмотреть сообщение
В С++ для этого есть operator new.
покажь
есть класс A
нужно выделить память под несколько экземпляров класса не вызывая при этом конструктор
переводить в char?
0
alsav22
5445 / 4840 / 831
Регистрация: 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;
}
0
Миниатюры
Запись динамического массива в файл (не правильно выводит данные)  
soican
49 / 23 / 3
Регистрация: 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));
0
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 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 *, поэтому нужно приведение типа.
"По хорошему" там надо ещё самому деструкторы вызывать перед освобождением памяти...
0
11.07.2013, 14:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 14:22

При передаче в функцию динамического массива, в массиве искажаются данные
Мне необходимо построить код Шеннона, на основе псевдокода, предложенного в...

Ошибка при выводе 1-го элемента массива, но правильно выводит последний
Помогите пожалуйста найти ошибку (почему не выводит переменную а?): #include...

Ввод и вывод динамического массива структур в бинарный файл
Добрейшего вечерочка, дамы и господа. Есть программа, которая считывает массив...


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

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

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