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

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

Восстановить пароль Регистрация
 
Kill100
 Аватар для Kill100
356 / 245 / 32
Регистрация: 11.12.2010
Сообщений: 1,060
Завершенные тесты: 1
13.03.2013, 05:05     Где ошибка? Чтение массива из файла #1
Пишу программу которая читает вектор и массив из файла.
После чего перемножает вектор на массив (получается в итоге вектор). причем отправка на кластеры происходит по столбцам.
Но прога да же читать файл не хочет. Файл физичиски присутствует и заполнено но на экран нечего не выводится, а прога падает.
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++ чтение из файла, ошибка в коде
C++ Чтение массива из файла
C++ Чтение из файла массива
Чтение массива из файла C++
C++ Чтение файла exe на другом компьютере, где нет Visual
C++ чтение из файла, где ошибка
Чтение массива из файла C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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
 Аватар для Kill100
356 / 245 / 32
Регистрация: 11.12.2010
Сообщений: 1,060
Завершенные тесты: 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, все норм стало
Yandex
Объявления
13.03.2013, 12:07     Где ошибка? Чтение массива из файла
Ответ Создать тему
Опции темы

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