6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
1

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

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

Author24 — интернет-сервис помощи студентам
Выделяю память под массив, заполняю его числами.

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2013, 22:11
Ответы с готовыми решениями:

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

Не правильно выводит данные
Здравствуйте, есть такой запрос SELECT COUNT(DISTINCT `tv_tid`) AS `tcnt`, ...

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

Выводит ошибку при создании динамического массива стрктур
#include &quot;pch.h&quot; #include &lt;iostream&gt; using namespace std; struct psh { string abc; double l;...

33
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
10.07.2013, 22:17 2
power12, сначала освобождаете память (free(mem_arr)), потом пользуетесь ею - надо наоборот, освобождать память, когда она уже не нужна.
1
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
10.07.2013, 22:21 3
Цитата Сообщение от power12 Посмотреть сообщение
free(mem_arr);
все нет у тебя больше памяти
отобрала система
может и свое что нибудь написать
или указатель поскольку уже невалидный может в другое место указывать
0
soican
10.07.2013, 22:44
  #4

Не по теме:

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

0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
10.07.2013, 22:48 5
Цитата Сообщение от soican Посмотреть сообщение
не люблю малоки алоки, откуда они вообще такие взялись?!
из Си
иногда даже очень необходимы
например выделить память без вызова конструктора
или есть еще такая штука realloc (с new такого не сделаешь)
перераспределить память
0
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
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
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
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
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
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
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
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
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
11.07.2013, 00:10 11
Цитата Сообщение от power12 Посмотреть сообщение
не не)) я про запятую, которая выводится в файл
А я тебе про что?
в цикле выводишь пять элементов с запятой
а потом после цикла шестой(последний) без запятой

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

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

C++
1
file_out << dec << mem_arr[c]<< "\n";
тут я завис...)
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.07.2013, 08:59 16
Цитата Сообщение от ValeryS Посмотреть сообщение
из Си
иногда даже очень необходимы
например выделить память без вызова конструктора
В С++ для этого есть operator new.
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
11.07.2013, 09:31 17
Цитата Сообщение от alsav22 Посмотреть сообщение
В С++ для этого есть operator new.
покажь
есть класс A
нужно выделить память под несколько экземпляров класса не вызывая при этом конструктор
переводить в char?
0
5499 / 4894 / 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/refer... ator%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
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
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2013, 14:22
Помогаю со студенческими работами здесь

Не правильно выводит данные о пользователе
&lt;?php $query = mysql_query(&quot;SELECT * FROM `session` ORDER BY `putdate` DESC&quot;); $query1 =...

Не правильно выводит данные код
Доброго времени суток такая проблема решил вывести формулу для эксперимента посмотрел на одном...

Что не правильно в вводе динамического массива?
#define _CRT_SECURE_NO_WARNINGS #include &lt;stdio.h&gt; int main() { char *ch; int m,i,t;...

Не правильно удаляет столбец двумерного динамического массива
Вот вообщем код, вместо того что-бы удалить столбец он заменяеться на адрессы элементов. #include...


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

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

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