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

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

Войти
Регистрация
Восстановить пароль
 
Kill100
404 / 270 / 37
Регистрация: 11.12.2010
Сообщений: 1,148
Завершенные тесты: 1
#1

Где ошибка? Чтение массива из файла - C++

13.03.2013, 05:05. Просмотров 887. Ответов 2
Метки нет (Все метки)

Пишу программу которая читает вектор и массив из файла.
После чего перемножает вектор на массив (получается в итоге вектор). причем отправка на кластеры происходит по столбцам.
Но прога да же читать файл не хочет. Файл физичиски присутствует и заполнено но на экран нечего не выводится, а прога падает.
stdafx.h
C++
1
2
3
4
5
6
7
8
9
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <mpi.h>
#include <ostream>
#include <istream>
#include <fstream>
Matrica_Na_Vector.cpp
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include "stdafx.h"
using namespace std;
 
//Считывание матриц из файла, Принимает имя файла, массив, вектор, размеры n и m
void Read_From_File(string FileName,int** &_array, int* &_vector, int &n, int &m)
{ 
    ifstream reads; 
    reads.open(FileName);//открываем файл
    reads>>n>>m;//считываем n и m
    _vector = new int[m];//Создаём вектор размера m
    _array=new int*[n]; //объявляем массив
    for (int i=0; i<n;i++)
    { 
        _array[i]=new int [m];
    }; 
    //считываем вектор
    for (int j=0; j<m; j++)
    {
        reads>>_vector[j]; //считываем вектор из файла
    }
    //Считываем массив
    for (int i=0; i<n; i++) 
    {
        for (int j=0; j<m; j++)
        {
            reads>>_array[i][j]; //считываем массив из файла
        }
    }
    reads.close();//закрываем файл
} 
 
//Запись матрицы в файл, Принимает вектор выходных данных и его размер
int** Write_To_File(int m, int* _vector, string FileName)
{ 
    ofstream writes;
    writes.open(FileName);//открываем файл
    for (int i=0; i<m; i++) 
    { 
        writes<<_vector[i]; //пишем вектор в файл
    }; 
    writes.close();//закрываем файл
} 
 
//Функция возвращает вектор который является результатом умножения вектора на столбцы
//длинна вектора должна равняться количеству столбцов в матрице
int* Multiply(int* vectors, int len_vector, int** mass, int mass_n)
{
    int* Return_Vektor = new int[mass_n];
    for(int i=0; i<mass_n; i++)
    {
        Return_Vektor[i]=0;//обнуляем значение
        for (int j=0; j<len_vector; j++)
        {
            Return_Vektor[i]+=mass[i][j]*vectors[j];//умножение вектора на столбцы
        }
    }
    return Return_Vektor;//возвращая результат
}
 
//Выводит вектор на экран консоли, принимает вектор и его размер
void Print_Vector_To_Screen(int*_vector,int m)
{
    printf("Vector:\n");
    for(int i = 0; i<m; i++)
        printf("%i ",_vector[i]);
    printf("\n");
}
 
//Выводит массив на экран консоли, принимает сам массив, и его размеры
void Print_Array_To_Screen(int** _array, int n, int m)
{
    printf("Array:\n");
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<m; j++)
        {
            printf("%i ",_array[i]);
        }
        printf("\n");
    }
}
 
int main(int argc, char* argv[])
{
    setlocale( LC_ALL,"Russian" );
 
    int myrank = 0;//Свой номер в группе
    int ranksize = 0;//кол-во процессов
 
    //инициализация куска MPI
    MPI_Init(&argc, &argv);
    //Определяем свой номер в группе:
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
    //Определяем количество процессов
    MPI_Comm_size(MPI_COMM_WORLD, &ranksize);
 
    if(myrank==0)//если это главный процесс
    {   
        int n=0, m=0;//Количество элементов в массиве
        int** _array,*_vector;//входной массив и вектор
        int* _out_vector = new int[m];//выходной вектор
        Read_From_File("D:\programming\MPI\Matrica_Na_Vector\Debug\Input.txt", _array, _vector, n, m);//считываем данные из файла
 
#pragma region отображение считанных данных на экран
        printf("Show  vector on screen? Y-1 / N-0:\n");
        bool flag=0;
        cin>>flag;
        if(flag==1)//если юзвер согласился
        {
            Print_Vector_To_Screen(_vector,m);//Выводим вектор на экран
            Print_Array_To_Screen(_array,n,m);//выводим массив на экран
        }
#pragma endregion
 
        int _count = m/(ranksize-1);//Количество столбцов для отправки
        //отправляем элементы массива
        for (int i =1 ; i<ranksize;i++)
        {
            MPI_Send(&n,1,MPI_INT,i,i,MPI_COMM_WORLD);//отправляем количество строк
            if(i+1!=ranksize)//если это не последний процесс
            {
                MPI_Send(&_count,1,MPI_INT,i,i,MPI_COMM_WORLD);//отправляем количество столбцов
                //MPI_Send(Array+cou*(i-1),n/(ranksize-1),MPI_INT,i,i,MPI_COMM_WORLD);//элементы массива
            }
            else //если это последний процесс
            {
                int t =( n-_count*(ranksize-2));
                MPI_Send(&t,1,MPI_INT,i,i,MPI_COMM_WORLD);//отправляем количество столбцов включая оставшиеся
                //MPI_Send(Array+cou*(i-1),t,MPI_INT,i,i,MPI_COMM_WORLD);//элементы массива
            }
        }
 
        MPI_Status stat;//статус
        for (int i =1 ; i<ranksize;i++)
        {
            /*int *retur;//ответ от сервера вектор
            MPI_Recv(&retur,1,MPI_INT,i,i,MPI_COMM_WORLD,&stat);//принимаем ответ от процесса*/
 
        }
 
    }
    else //иначе если это не главный то получаем,
    {
        MPI_Status status;//Статус процесса получения
        int n=0, m=0;//количество строк количество столбцов
        MPI_Recv(&n, 1, MPI_INT, 0, myrank, MPI_COMM_WORLD,&status);
        MPI_Recv(&m, 1, MPI_INT, 0, myrank, MPI_COMM_WORLD,&status);
        int* _vector= new int[m];//вектор кусок общего
        int** _array; //массив кусок общего массива (несколько столбцов) 
        //получаем вектор
        MPI_Recv(_vector,m, MPI_INT, 0, myrank,MPI_COMM_WORLD,&status);
        printf("Get count elements vector %i im  %i\n",m,myrank);
        /*
        дописать получение массива (столбцов) потом сделаю
        */
    }   
    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Finalize();
    //system("pause");
    return 0;
}
Добавлено через 13 минут
Пример файла
Кликните здесь для просмотра всего текста
10 10
1 2 3 4 5 6 7 8 9 10
1 2 3 1 1 6 7 1 9 10
1 5 7 8 9 4 2 6 1 11
5 7 5 1 1 1 2 6 4 8
0 5 1 2 5 0 4 8 0 9
5 4 7 7 8 9 6 6 6 6
2 5 4 8 1 3 6 8 85 8
44 4 7 5 6 6 6 6 6 6
3 6 4 4 8 4 5 1 2 1
8 5 4 6 9 4 4 1 2 3
3 3 3 3 3 8 4 7 7 8
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2013, 05:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Где ошибка? Чтение массива из файла (C++):

чтение из файла, где ошибка - C++
вроде все правильно... #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; using namespace std; ...

Чтение файла exe на другом компьютере, где нет Visual - C++
У меня Vusial Studio 2008 (rus). Я написал программу. Она работает, все хорошо... Но если только один файл .exe скопировать в другой...

чтение из файла, ошибка в коде - C++
Здравствуйте. Жутко стыдно обращаться с такой пустяковой проблемой, но... Я уже битый час воюю с с++, пытаясь найти ошибку в коде. ...

Ошибка чтение файла в консоли - C++
Ниже реализована программа по обработке файла данных &quot; Репертуар кинотеатров&quot; в котором указаны название кинотеатра и название фильма,...

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

Чтение массива из файла - C++
Здравствуйте, подскажите, пожалуйста почему не происходит чтение из файла #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.03.2013, 05:27 #2
Путь к файлу:
C++
1
Read_From_File("D:\\programming\\MPI\\Matrica_Na_Vector\\Debug\\Input.txt", _array, _vector, n, m)
Проверьте открытие файла. Все дальнейшие действия будут, если файл открылся для чтения:
Кликните здесь для просмотра всего текста
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
//Считывание матриц из файла, Принимает имя файла, массив, вектор, размеры n и m
bool Read_From_File(string FileName, int** &_array, int* &_vector, int &n, int &m)
{ 
    ifstream reads; 
    reads.open(FileName);//открываем файл
    if (!reads.is_open()) 
    {
        cout << "Error!" << endl;
        return false;
    }
    else
    {
        reads >> n >> m;//считываем n и m
        _vector = new int[m];//Создаём вектор размера m
        _array=new int*[n]; //объявляем массив
        for (int i=0; i<n;i++)
        { 
            _array[i]=new int [m];
        }; 
        //считываем вектор
        for (int j = 0; j < m; j++)
        {
            reads >> _vector[j]; //считываем вектор из файла
        }
        //Считываем массив
        for (int i = 0; i < n; i++) 
        {
            for (int j = 0; j < m; j++)
            {
                reads >> _array[i][j]; //считываем массив из файла
            }
        }
        reads.close();//закрываем файл
        return true;
    }
} 
 
//Запись матрицы в файл, Принимает вектор выходных данных и его размер
int** Write_To_File(int m, int* _vector, string FileName)
{ 
    ofstream writes;
    writes.open(FileName);//открываем файл
    for (int i=0; i<m; i++) 
    { 
        writes<<_vector[i]; //пишем вектор в файл
    }; 
    writes.close();//закрываем файл
} 
 
//Функция возвращает вектор который является результатом умножения вектора на столбцы
//длинна вектора должна равняться количеству столбцов в матрице
int* Multiply(int* vectors, int len_vector, int** mass, int mass_n)
{
    int* Return_Vektor = new int[mass_n];
    for(int i=0; i<mass_n; i++)
    {
        Return_Vektor[i]=0;//обнуляем значение
        for (int j=0; j<len_vector; j++)
        {
            Return_Vektor[i]+=mass[i][j]*vectors[j];//умножение вектора на столбцы
        }
    }
    return Return_Vektor;//возвращая результат
}
 
//Выводит вектор на экран консоли, принимает вектор и его размер
void Print_Vector_To_Screen(int*_vector,int m)
{
    printf("Vector:\n");
    for(int i = 0; i<m; i++)
        printf("%i ",_vector[i]);
    printf("\n");
}
 
//Выводит массив на экран консоли, принимает сам массив, и его размеры
void Print_Array_To_Screen(int** _array, int n, int m)
{
    printf("Array:\n");
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<m; j++)
        {
            printf("%i ",_array[i]);
        }
        printf("\n");
    }
}
 
int main(int argc, char* argv[])
{
    setlocale( LC_ALL,"Russian" );
 
    int myrank = 0;//Свой номер в группе
    int ranksize = 0;//кол-во процессов
 
    //инициализация куска MPI
    MPI_Init(&argc, &argv);
    //Определяем свой номер в группе:
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
    //Определяем количество процессов
    MPI_Comm_size(MPI_COMM_WORLD, &ranksize);
 
    if(myrank==0)//если это главный процесс
    {   
        int n=0, m=0;//Количество элементов в массиве
        int** _array,*_vector;//входной массив и вектор
        int* _out_vector = new int[m];//выходной вектор
        if (Read_From_File("D:\\programming\\MPI\\Matrica_Na_Vector\\Debug\\Input.txt", _array, _vector, n, m))//если файл открылся, считываем данные из файла
        {
 
    #pragma region отображение считанных данных на экран
            printf("Show  vector on screen? Y-1 / N-0:\n");
            bool flag=0;
            cin>>flag;
            if(flag==1)//если юзвер согласился
            {
                Print_Vector_To_Screen(_vector,m);//Выводим вектор на экран
                Print_Array_To_Screen(_array,n,m);//выводим массив на экран
            }
    #pragma endregion
 
            int _count = m/(ranksize-1);//Количество столбцов для отправки
            //отправляем элементы массива
            for (int i =1 ; i<ranksize;i++)
            {
                MPI_Send(&n,1,MPI_INT,i,i,MPI_COMM_WORLD);//отправляем количество строк
                if(i+1!=ranksize)//если это не последний процесс
                {
                    MPI_Send(&_count,1,MPI_INT,i,i,MPI_COMM_WORLD);//отправляем количество столбцов
                    //MPI_Send(Array+cou*(i-1),n/(ranksize-1),MPI_INT,i,i,MPI_COMM_WORLD);//элементы массива
                }
                else //если это последний процесс
                {
                    int t =( n-_count*(ranksize-2));
                    MPI_Send(&t,1,MPI_INT,i,i,MPI_COMM_WORLD);//отправляем количество столбцов включая оставшиеся
                    //MPI_Send(Array+cou*(i-1),t,MPI_INT,i,i,MPI_COMM_WORLD);//элементы массива
                }
            }
 
            MPI_Status stat;//статус
            for (int i =1 ; i<ranksize;i++)
            {
                /*int *retur;//ответ от сервера вектор
                MPI_Recv(&retur,1,MPI_INT,i,i,MPI_COMM_WORLD,&stat);//принимаем ответ от процесса*/
 
            }
 
        }
        else //иначе если это не главный то получаем,
        {
            MPI_Status status;//Статус процесса получения
            int n=0, m=0;//количество строк количество столбцов
            MPI_Recv(&n, 1, MPI_INT, 0, myrank, MPI_COMM_WORLD,&status);
            MPI_Recv(&m, 1, MPI_INT, 0, myrank, MPI_COMM_WORLD,&status);
            int* _vector= new int[m];//вектор кусок общего
            int** _array; //массив кусок общего массива (несколько столбцов) 
            //получаем вектор
            MPI_Recv(_vector,m, MPI_INT, 0, myrank,MPI_COMM_WORLD,&status);
            printf("Get count elements vector %i im  %i\n",m,myrank);
            /*
            дописать получение массива (столбцов) потом сделаю
            */
        }   
        MPI_Barrier(MPI_COMM_WORLD);
        MPI_Finalize();
    
    }
    
    system("pause");
    return 0;
}

Добавлено через 6 минут
С исправлениями нормально выводит файл.
Kill100
404 / 270 / 37
Регистрация: 11.12.2010
Сообщений: 1,148
Завершенные тесты: 1
13.03.2013, 12:07  [ТС] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
(!reads.is_open()
Странно что я делаю не так? У меня файл считывается, но все числа пишет 0.
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
//Считывание матриц из файла, Принимает имя файла, массив, вектор, размеры n и m
bool Read_From_File(char* FileName, int** &_array, int* &_vector, int &n, int &m)
{ 
    ifstream reads; 
    reads.open(FileName);//открываем файл
    if(reads.is_open())//если удалось открыть
    {
        reads>>n>>m;//считываем n и m
        _vector = new int[m];//Создаём вектор размера m
        _array=new int*[n]; //объявляем массив
        for (int i=0; i<n;i++)
        { 
            _array[i]=new int [m];
        }; 
        //считываем вектор
        for (int j=0; j<m; j++)
        {
            reads >> _vector[j]; //считываем вектор из файла
        }
        //Считываем массив
        for (int i=0; i<n; i++) 
        {
            for (int j=0; j<m; j++)
            {
                reads>>_array[i][j]; //считываем массив из файла
            }
        }
        reads.close();//закрываем файл
    }
    else
    {
        printf("File \"%s\" can not be read.\n", FileName);
        reads.close();//закрываем файл
        return 0;
    }
    return 1;
}
Добавлено через 8 минут
Всё разобрался где была засада.
У меня файл сохранился с числами как UTF-8.
Пере-сохранил в ASCII, все норм стало
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2013, 12:07
Привет! Вот еще темы с ответами:

Чтение из файла массива - C++
Пожалуйста помогите разобрать чтение двумерного масиива из файла(не могу найти чтото понятное(

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

Чтение массива из файла - C++
Здравствуйте! Возникла проблема со считыванием матрицы... for(int i=0;i&lt;y;i++){ for(int j=0;j&lt;x;j++){ fi&gt;&gt;*(ptd+y*i+j); ...

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


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

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

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