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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
star_fish_xd
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 5
#1

Не могу считать матрицу из файла в динамический массив - C++

10.03.2014, 00:15. Просмотров 1656. Ответов 11
Метки нет (Все метки)

Вот проблемный кусок программы:
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
fstream f (strConst);
        if (! f)
        {
            cout<<"Error_3";
            return 1;
        }
        int numberOfString=0;
        while (!f.eof()) if (f.get()=='\n') numberOfString++;  //считаем количество строк
        numberOfString+=1;
        cout<<numberOfString<<endl;
 
        int **a=new int *[numberOfString];     
        for (int i=0; i<numberOfString; i++)
        {
            a[i]=new int [SIZE2];
        }
 
        
        for (int i=0; i<numberOfString; i++)
    {
        for (int j=0; j<SIZE2; j++)
            f<<a[i][j];                               //не работает, непон€тно почему!
    }
 
        /*
        for (int i=0; i<numberOfString; i++)
    {
        for (int j=0; j<SIZE2; j++)                       //в таком виде все работает  
            a[i][j]=0;
    }
 
 
    */
    for (int i=0; i<numberOfString; i++)
    {
        for (int j=0; j<SIZE2; j++)
            cout<<a[i][j]<<" ";
    }
 
    delete [] a;
 
 
    f.close();
я создаю динамический двумерный массив и пытаюсь записать в него матрицу вида 1 1
1 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
#include "stdafx.h"
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
 
int main()
{
    fstream f ("D:\\text.txt");
    int array1 [2] [2];
    for (int i=0; i<2; i++)
    {
        for (int j=0; j<2; j++)
            f>>array1[i][j];
    }
    
    for (int i=0; i<2; i++)
    {
        for (int j=0; j<2; j++)
            cout<<array1[i][j]<<" ";
    }
    f.close();
    getch();
    return 0;
}
работает, хотя отличие только в том что размеры массива не динамические.
то есть получается что по отдельности все работает, а когда я пытаюсь одновременно и создать динамический массив и заполнить его матрицей из файла, программа не срабатывает. Помогите пожалуйста найти ошибку!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2014, 00:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу считать матрицу из файла в динамический массив (C++):

Считать матрицу в динамический массив - C++
Есть функция для статического массива, как ее переделать в динамический? в файле матрица: 4 4 4 4 4 4 4 4 4 4 4 4...

Считать квадратную матрицу в динамический массив. - C++
нужно просто считать квадратную матрицу в динамический массив. Вот реализация кода: int main() { int range = 3; double **matrix =...

Считать строки файла и поместить в динамический массив строк - C++
Ребята помогите. Нужно считать с файла, в котором 1 строка - 1 слово, строки и поместить их в динамический массив строк типа char...

Считать данные из файла в динамический массив соответствующего типа - C++
Здравствуйте. Тема динамические структуры. Считать данные из файла в динамический массив соответствующего типа. 1) В файле целых...

Не могу считать массив из файла - C++
доброго времени суток! толкнулся с проблемой считывания из файла миллиона чисел формата long long int в массив через fscanf. причем с файла...

Считать из файла целочисленный массив C[N] и сформировать из него максимально возможную матрицу А [n x n] - C++
Считать из файла целочисленный массив C и сформировать из него максимально возможную матрицу А . Причем на главной диагонали должны...

11
Fene4ka_
91 / 91 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
10.03.2014, 00:42 #2
star_fish_xd, а где вы инициилизируете size2 ?
0
star_fish_xd
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 5
10.03.2014, 02:20  [ТС] #3
SIZE2 задан в начале проги как константа: const int SIZE2=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
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
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
const int SIZE1 = 200;
const int SIZE2= 2;
const char strConst[100]="D:\\temp.txt";
 
 
int main()
{
    cout<<"Input the filepath to the text file with data (example: D:\\\\text.txt):"<<endl;
    char str[SIZE1];
    cin>>str;
    ifstream in (str);
    ofstream out (strConst);
    if(! in)
    {
        cout<<"Error_1";
        return 1;
    }
 
    if (!out)
    {
        cout<<"Error_2";
        return 1;
    }
    char ch;
    while (in.get(ch))
    {
        if(ch==',')
        {
            ch=' ';
        }
        out.put(ch);
        cout<<ch;
    }
    in.close();
    out.close();
 
    fstream f (strConst);
        if (! f)
        {
            cout<<"Error_3";
            return 1;
        }
        int numberOfString=0;
        while (!f.eof()) if (f.get()=='\n') numberOfString++;  //считаем количество строк
        numberOfString+=1;
        cout<<numberOfString<<endl;
 
        int **a=new int *[numberOfString];     
        for (int i=0; i<numberOfString; i++)
        {
            a[i]=new int [SIZE2];
        }
 
        
        for (int i=0; i<numberOfString; i++)
    {
        for (int j=0; j<SIZE2; j++)
            f<<a[i][j];                               //не работает, непон€тно почему!
    }
 
        /*
        for (int i=0; i<numberOfString; i++)
    {
        for (int j=0; j<SIZE2; j++)                       //в таком виде все работает  
            a[i][j]=0;
    }
 
 
    */
    for (int i=0; i<numberOfString; i++)
    {
        for (int j=0; j<SIZE2; j++)
            cout<<a[i][j]<<" ";
    }
 
    delete [] a;
 
 
    f.close();
 
        
    getch();
    return 0;
}
Добавлено через 1 час 27 минут
Fene4ka_, SIZE2 задан в начале проги как константа: const int SIZE2=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
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
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
const int SIZE1 = 200;
const int SIZE2= 2;
const char strConst[100]="D:\\temp.txt";
 
 
int main()
{
    cout<<"Input the filepath to the text file with data (example: D:\\\\text.txt):"<<endl;
    char str[SIZE1];
    cin>>str;
    ifstream in (str);
    ofstream out (strConst);
    if(! in)
    {
        cout<<"Error_1";
        return 1;
    }
 
    if (!out)
    {
        cout<<"Error_2";
        return 1;
    }
    char ch;
    while (in.get(ch))
    {
        if(ch==',')
        {
            ch=' ';
        }
        out.put(ch);
        cout<<ch;
    }
    in.close();
    out.close();
 
    fstream f (strConst);
        if (! f)
        {
            cout<<"Error_3";
            return 1;
        }
        int numberOfString=0;
        while (!f.eof()) if (f.get()=='\n') numberOfString++;  //считаем количество строк
        numberOfString+=1;
        cout<<numberOfString<<endl;
 
        int **a=new int *[numberOfString];     
        for (int i=0; i<numberOfString; i++)
        {
            a[i]=new int [SIZE2];
        }
 
        
        for (int i=0; i<numberOfString; i++)
    {
        for (int j=0; j<SIZE2; j++)
            f<<a[i][j];                               //не работает, непон€тно почему!
    }
 
        /*
        for (int i=0; i<numberOfString; i++)
    {
        for (int j=0; j<SIZE2; j++)                       //в таком виде все работает  
            a[i][j]=0;
    }
 
 
    */
    for (int i=0; i<numberOfString; i++)
    {
        for (int j=0; j<SIZE2; j++)
            cout<<a[i][j]<<" ";
    }
 
    delete [] a;
 
 
    f.close();
 
        
    getch();
    return 0;
}
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2014, 02:40 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от star_fish_xd Посмотреть сообщение
f<<a[i][j]; * * * * * * * * * * * * * * * //не работает, непон€тно почему!
Тут вы разве из файла читаете?
C++
1
f >> a[i][j];
И после подсчёта строк сделайте:
C++
1
2
f.clear();
f.seekg(0);
Добавлено через 6 минут
И не нужно создавать универсальный поток, если нужно только чтение из файла.
1
Fene4ka_
91 / 91 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
10.03.2014, 02:59 #5
star_fish_xd, если вы хотите заполнить массив данными из файла, путь к которому вводит пользователь, то ошибка в строчке 42, но однако это не отменяет того факта, что под массив почему-то не выделяется память скиньте плз условие вашей задачи, мб сделаю по-своему
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2014, 04:02 #6
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
что под массив почему-то не выделяется память
А это что, по-вашему?
C++
1
2
3
4
5
int **a=new int *[numberOfString];     
for (int i=0; i<numberOfString; i++)
{
      a[i]=new int [SIZE2];
}
0
Fene4ka_
91 / 91 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
10.03.2014, 04:20 #7
alsav22, тем неменее в пошаговой обработки там нечего нету я переписывал немного код, чтобы точно посмотреть, получалось, что с файла выцепливал единичку в переменную, но записать в массив не мог
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2014, 04:26 #8
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
но записать в массив не мог
А где там запись в массив? Вот это?
C++
1
2
3
4
5
for (int i=0; i<numberOfString; i++)
{
    for (int j=0; j<SIZE2; j++)
         f<<a[i][j];                               //не работает, непон€тно почему!
}
Видите здесь запись в массив?
0
star_fish_xd
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 5
10.03.2014, 13:38  [ТС] #9
alsav22, да, f<<a[i][j] по идее должна считать массив если в тексте все правильно оформлено, есть переходы между строками \n. но все равно видимо проблема как раз в этой части кода, и я не пойму почему тут не происходит запись, ведь если массив статический как тут
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
#include "stdafx.h"
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
 
int main()
{
    fstream f ("D:\\text.txt");
    int array1 [2] [2];
    for (int i=0; i<2; i++)
    {
        for (int j=0; j<2; j++)
            f>>array1[i][j];
    }
    
    for (int i=0; i<2; i++)
    {
        for (int j=0; j<2; j++)
            cout<<array1[i][j]<<" ";
    }
    f.close();
    getch();
    return 0;
}
то все записывается.

Добавлено через 5 минут
alsav22, и кстати спасибо за f.clear();
f.seekg(0); я с этим тоже долго мучился)

Добавлено через 9 минут
Fene4ka_, благодарю за желание помочь задача вообще такая: с осциллографа на комп скидывается текстовый файл, в котором записаны x и y, то есть двухмерный массив, в столбиках друг под другом. при этом в файле еще записаны лишние символы типа , и тд которые надо отфильтровать, что я и делаю в первой части проги. потом после считывания массива с ним идет чисто математическая работа, то есть надо его численно проинтегрировать, то есть (x2-x1)*y1 и просуммировать по всем x y и после этого результат подставить в формулу, но с этим я и сам справлюсь, у меня проблема в том что я никак не могу получить этот массив a[x] [y].

Добавлено через 2 минуты
Fene4ka_, конечно все это спокойно можно сделать в экселе но эксель для слабаков))
0
Fene4ka_
91 / 91 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
10.03.2014, 15:39 #10
alsav22, перечитайте полностью мое сообщение, особенно четыре слова после смайлика

Добавлено через 1 минуту
star_fish_xd, для заполнения массива попробуйте использовать strtok, мб так получится
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2014, 19:46 #11
Цитата Сообщение от star_fish_xd Посмотреть сообщение
f<<a[i][j] по идее должна считать массив
Это не чтение в массив, а запись из массива в файл.
Вот это - >> чтение, вот это - << запись. Посты не читаете?
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
f<<a[i][j]; //не работает, непон€тно почему!
Тут вы разве из файла читаете?
C++
1
f >> a[i][j];
Добавлено через 1 минуту
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
alsav22, перечитайте полностью мое сообщение, особенно четыре слова после смайлика
Перечитал, и что?
0
star_fish_xd
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 5
10.03.2014, 22:59  [ТС] #12
alsav22, да, я там реально >> и << перепутал, но все равно после исправления ничего не работает, выдает мусор.

Добавлено через 23 минуты
alsav22, все, проблема решена, спасибо огромное! дело было в том что я clear() и seekg(0) не использовал, курсор чтения был в конце файла.
0
10.03.2014, 22:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 22:59
Привет! Вот еще темы с ответами:

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

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

Почему то не могу считать матрицу - C++
Есть матрица порядка 3638. Мне нужно найти обратную к ней. ( В последствии порядок матрицы будет около 100 000) Есть код, вот только он...

Файл: Считать все числа из файлав динамический массив - C++
&quot;Считать все числа из файла(количество чисел в файле - произвольное) в динамический массив(целые числа). В программе предусмотреть функции,...


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

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

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