Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Мишка Косолапый :)
284 / 254 / 86
Регистрация: 15.02.2012
Сообщений: 1,511
1

Путь к файлу и чтение матрицы символов

14.02.2015, 11:18. Показов 534. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача в чтении матрицы символов из файла.


C++
1
2
ifstream F;
F.open("C:\\Users\\ss\\Desktop\\C++\\Programm_2s\\Debug\\1.txt");
Как путь сделать просто
C++
1
F.open("1.txt");
Чтобы местонахождение файла определялось автоматически?

А дальше проблема в чтении. 1 строку прочитать не проблема, использовав
C++
1
2
3
4
5
6
    F.open("C:\\Users\\ss\\Desktop\\C++\\Programm_2s\\Debug\\1.txt");
    while (!F.eof())
    {
        F >> a;
        cout << a << endl;
    }
Но проблема в том, что в файле матрица выглядит так:
Кликните здесь для просмотра всего текста
F W R J Y H Y W E R
K M N H F K J D L K
K J H D R W E Q A S
M N V C Z X P P R W
J H G S A S K L I R
N F Y R J D K F L W
J R Y U L O F D R W


И записать её нужно в динамический массив, как определить конец строки? Чтобы записывать каждую строку, и так пока строки не кончатся?

Подскажите как лучше это сделать, при том, что создавать динамический массив я умею только так:
C++
1
2
3
    int** mas=new int *[m]; 
    for (i=0;i<=m;i++)
        *(mas+i)=new int [n];
Непонятные конструкции не хочу, мне нужно понять что да как
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2015, 11:18
Ответы с готовыми решениями:

OpenFileDialog. Получить путь к файлу на чтение которого нет прав
Есть файл, владельцем которого я не являюсь и прав на его чтение у меня нет. Подскажите, как в...

Поисковик файлов. Если путь к файлу содержит больше 248 символов, то программа выдает ошибку
В общем проблема такая, пишу в VS2010, здесь нашел код одного поисковика, немного изменил :...

Как программно получить путь к файлу конфигураций программы (файлу user.config)?
Задался целью программно очистить параметры программы, которые сохраняются в файле user.config....

Файл: Получить полный путь к файлу и записать этот путь в отдельную переменную.
Доброго времени суток.Столкнулся с проблемой в ходе выполнения задачи. Мне нужно получить полный...

15
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
14.02.2015, 11:51 2
Автоматически оно не может определиться. Файл туда же помести, где сама программа. Тогда можно без пути, только запускать программу надо непосредственно.

Считывать надо строками - getline(), затем через istringstream разделишь на элементы.
Ну или если знаешь, сколько в строке элементов, то циклом for.
1
Заблокирован
Автор FAQ
14.02.2015, 11:56 3
zuxa-zuxa, отладчик сам устанавливает текущим каталог проекта, ложить файл данных нужно туда же.
1
Мишка Косолапый :)
284 / 254 / 86
Регистрация: 15.02.2012
Сообщений: 1,511
14.02.2015, 12:05  [ТС] 4
Разобрался с путём.

А как использовать getline?
Мне их бы в одномерный массив все записать, узнав сколько строк.
Потом одномерный массив упорядочу и распределю в матрицу и готово
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
14.02.2015, 12:20 5
Так размер массива известен заранее?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    F.open("1.txt");
        string s;
        int i = 0;
    while (!F.eof())
    {
        getline(F, s);
        istringstream ss(s);
        int j = 0;
        while (!ss.eof()) 
        {
             ss >> mas[i][j];
             ++j;
        }
        ++i;
    }
0
Мишка Косолапый :)
284 / 254 / 86
Регистрация: 15.02.2012
Сообщений: 1,511
14.02.2015, 12:52  [ТС] 6
Размеры не известны

Добавлено через 6 минут
И в ваш код не хочет компилироваться, не могу поправить, getline не работает

Добавлено через 22 минуты
Даже если статический массив создать, не компилируется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    char mas[100][100];
 
    F.open("1.txt");
    string s;
    int i = 0;
    while (!F.eof())
    {
        getline(F, s);
        istringstream ss(s);
        int j = 0;
        while (!ss.eof()) 
        {
             ss >> mas[i][j];
             ++j;
        }
        ++i;
    }
Ошибка на 9 строке. Подчеркнуто ss
Ошибка 1 error C2079: "ss" использует неопределенный class "std::basic_istringstream<_Elem,_Traits,_Alloc>"
0
Заблокирован
Автор FAQ
14.02.2015, 13:28 7
zuxa-zuxa,
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
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;
 
int main(){
    //это эммуляция файла
    string data = "1 2 3\n"
                  "4 5 6\n"
                  "7 8 9";
    string line;
    float fValue = 0;
    vector< vector< float > > matrix;
    stringstream ifs(data);//заменить на fstream.open
    while( ifs>>line )
    {
        vector< float > fLine;
        stringstream ss(line);
        while( ss>>fValue )
            fLine.push_back(fValue);
        matrix.push_back(fLine);
    }
    for( size_t i = 0; i < matrix.size(); i++ )
    {
        for( size_t j = 0; j < matrix[i].size(); j++ )
            cout<<matrix[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}
http://codepad.org/I6sSx1GH
1
Мишка Косолапый :)
284 / 254 / 86
Регистрация: 15.02.2012
Сообщений: 1,511
14.02.2015, 13:52  [ТС] 8
Много непонятного в коде
19 строка в особенности

Добавлено через 2 минуты
Немного другим, обходным путём пошел, ещё маленький вопросик: как начать чтение файла сначала более корректно, чем
C++
1
2
    F.close();
    F.open("1.txt");
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
14.02.2015, 14:01 9
Переместиться к началу:
C++
1
2
F.seekg(0, F.beg);
F.clear();
1
Заблокирован
Автор FAQ
14.02.2015, 14:20 10
zuxa-zuxa, vector - шаблонизированный контейнер данных реализующий сущность динамического массива, неужели никогда не слышал?
0
Мишка Косолапый :)
284 / 254 / 86
Регистрация: 15.02.2012
Сообщений: 1,511
14.02.2015, 14:27  [ТС] 11
Нет
Для меня вектор-это направленный отрезок
0
Заблокирован
Автор FAQ
14.02.2015, 14:36 12
Цитата Сообщение от zuxa-zuxa Посмотреть сообщение
Для меня вектор-это направленный отрезок
а лист это не список а кусок бумаги?Кури http://www.cplusplus.com/reference/vector/vector/ пригодится.
0
Мишка Косолапый :)
284 / 254 / 86
Регистрация: 15.02.2012
Сообщений: 1,511
14.02.2015, 14:47  [ТС] 13
C++
1
2
F.seekg(0, F.beg);
F.clear()
Работает только 1 раз, если эти строчки дважды использовать-не работает
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
14.02.2015, 14:53 14
Покажи, что получилось.
0
Мишка Косолапый :)
284 / 254 / 86
Регистрация: 15.02.2012
Сообщений: 1,511
14.02.2015, 15:06  [ТС] 15
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
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
 
ifstream F;
int k = 0, kk = 0, i = 0, q;
char c;
string s;
char mas[50][50];
char m[250];
int mm[250];
 
 
void sort_vstavk(int* a, int size) 
{
    int i, j, te;
    for (i = 0; i < size; i++)
    {
        te = a[i]; 
        for (j = i - 1; j >= 0 && a[j] > te; --j)
            a[j + 1] = a[j];    
        a[j + 1] = te;    
    }
}
 
void sort_obmenom_po_ucebniku(int* a, int size)
{
    int te;
    for (int i=0;i < size-1;i++)
        for (int j=0;i < size-1;j++)
            if (a[j+1] < a[j])
            {
                te = a[j + 1]; 
                a[j + 1] = a[j]; 
                a[j] = te;
            }       
}
 
void input()
{
    F.open("1.txt");
    
    while (!F.eof())
    {
        getline(F, s);
        k++;
    }
 
    F.seekg(0, F.beg);
    F.clear();
 
 
    while (!F.eof())
    {
        F >> c;
        ++kk;
    }
    kk=kk-1;
 
    F.close();
    F.open("1.txt");
 
    while (!F.eof())
    {
        F >> m[i];
        i++;
    }
    F.close();
}
 
void ci()
{
    for (i=0;i<kk;i++)
        mm[i]=m[i]; 
}
 
void ic()
{
    for (i=0;i<kk;i++)
        m[i]=static_cast<int>(mm[i]);
}
 
void form_mas()
{
    for (i=0;i<k;i++)
        for (int j=0;j<(kk/k);j++)
        {
            mas[i][j]=m[i*(kk/k)+j];
        }
}
 
void main()
{
    input();
    ci();
    //sort_vstavk(mm, kk);
    sort_obmenom_po_ucebniku(mm, kk);
    ic();
    form_mas();
 
 
 
    system("pause");    
}
Полностью программа.
И да, реализую 2 способ упорядочить массив-обменом(пузырьком) и ошибка, при выполнении ошибка, а не в коде.
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
14.02.2015, 15:39 16
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
    F.open("1.txt");
    
    while (true)
    {
        getline(F, s);
        if (F.eof()) break;
        k++; // строк
    }
 
    F.seekg(0, F.beg);
    F.clear();
 
    getline(F, s);
    istringstream iss(s);
    while (true)
    {
        iss >> c;
        if (iss.eof()) break;
        ++kk; // столбцов
    }
 
    F.seekg(0, F.beg);
    F.clear();
 
    for (int i = 0; i < k; ++i)
        for (int j = 0; j < kk; ++j)
            F >> mas[i][j];
 
    F.close();
1
14.02.2015, 15:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2015, 15:39
Помогаю со студенческими работами здесь

Разбить путь к файлу на части - путь, файл и расширение
Как разбить путь к файлу на части - путь, файл и расширение? Например: c:\kuku\part1\name.txt ...

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

Путь к файлу
Здравствуйте. С помощью string trtr= System.Windows.Forms.Application.ExecutablePath; получаю путь...

Путь к файлу
Всем привет) помогите как считать строки с файла, вроде все работает но файл не находит, как...


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

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