Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/68: Рейтинг темы: голосов - 68, средняя оценка - 4.97
-8 / 0 / 0
Регистрация: 27.02.2019
Сообщений: 43

Чтение строк из файла в переменную и действия с ней

12.03.2019, 16:02. Показов 13510. Ответов 40

Студворк — интернет-сервис помощи студентам
Здравствуйте, мне необходимо произвести чтение из первой строки двух параметров в две переменные.
Затем читать строки в переменную str, пока не eof.
Затем эту строку нужно преобразовать в массив строк содержащий подстроки разделенные tab, чтоб потом эти числа в инты перевести. Когда я пытался это делать в вижуале, то пробовал сделать двумерный вектор, но не вышло, вот мой код из вижуала.
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
#include "stdafx.h"
#include "stdio.h"
#include <iostream>
#include <string> //подключаем строки
#include <fstream> //подключаем файлы
#include <sstream>
#include <vector>
 
using namespace std;    //используем стандартное пространство имен
 
int main()
{
 setlocale(LC_ALL, "rus");
 int rx,ry = 0;
 string str;    // сюда будем считываться строки из файла
 
 ifstream file ("test.txt");    //создаем объект класса ifstream
 
 if (!file.is_open())   // (метод) если файл не открыт
        cout << "Файл не может быть открыт!\n";        // сообщить об этом
    else
    {
    file >> rx;
    file >> ry;
    cout << "rx = " << rx << endl;
    cout << "ry = " << ry << endl;
    cout << "str = ";
        while(getline(file, str))   // пока не достигнут конец файла класть очередную строку в переменную (str)
    {
        cout << str << endl;        // выводим на экран ( для проверки правильности считанных данных)
 
    vector <vector <string> > VV;
    string ch; // будет содержать текущее число из строки
    stringstream lst(str);
    vector <string> array;
    while(lst >> ch)
    {
        array.push_back(ch); //первый vector
    VV.push_back(array);
    }
    for( int i=0; i < VV.size(); i++)
    {
        for( int j=0; j < VV[i].size(); j++)
        //cout <<" Ch #" << i + 1 << " : " << array[i] << endl;
            cout << VV[i][j] << " ";
      cout << endl;  
    }
    }
    file.close();
    return 0;
 }
}

я пытался сделать эту программу в вижуале, но мне всё равно в итоге пришлось бы её переделывать под Qt (использовать qtшные функции и т.д.)
Как мне реализовать подобное задание в Qt с использование QFile, QString, QStringList, QTextStream и другие.
Вот мой набросок из Qt.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(int argc, char *argv[])
{   
    QFile file("mtrh.txt");
     if(file.open(QIODevice::ReadOnly |QIODevice::Text))
        {
            //читаем строку
            QString str = file.readLine();
            //Делим строку на слова разделенные пробелом
            QStringList lst = str.split(" ");
            QTextStream in(&test_file);
            while(!file.atEnd())
            {
             strings += in.readLine().split(" ");
             test_file.close();
            }
          }
        else
        {
            qDebug()<< "don't open file";
        }
Пример файла:
10 10
100 200 300 500
1000 500 150 700
2100 1010 1200 400
Знаю, что сумбурно и наверное не понятно звучит задание, просто я запутался в с поиском аналогов функций в Qt и решил спросить знающих людей.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.03.2019, 16:02
Ответы с готовыми решениями:

Чтение строк из файла в переменную (ifstream)
Пожалуйста помогите, не пойму как из текстового файла сохранить строки в переменную типа массив строк. Внутри цикла while(!ssid.eof()){}...

Чтение строк текста из файла и запись каждой в свою переменную
В файле input.txt две строки, необходимо чтобы прога прочитала первую строку и записала ее в переменную LineA, а вторую строку в переменную...

Чтение матрицы из файла и действие над ней
Всем привет! В институте дали задание решить, которое заключается а следующем: Найти сумму элементов на верхней и нижней диагоналях,...

40
-8 / 0 / 0
Регистрация: 27.02.2019
Сообщений: 43
15.03.2019, 16:13  [ТС]
Студворк — интернет-сервис помощи студентам
nd2, Я ни слова не сказал о 10х10.
Да мне нужно читать по строке, мне нужно выводить двумерный массив, а не одномерный, как в вашей реализации.

Добавлено через 2 минуты
nd2, Да, понял свою ошибку, изначально в файле было просто 10 и 10 для теста, в дальнейшем это будет указатель размерности.
Я привел в своём вопросе матрицу с которой хотел выполнить нужные мне действия:

100 200 300 500
1000 500 150 700
2100 1010 1200 400
4000 3000 2000 1000
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
15.03.2019, 16:14
Цитата Сообщение от paradise19 Посмотреть сообщение
Я ни слова не сказал о 10х10.
Ты сказал о rx и ry, в твоих примерах файлов - это 10 и 10. Последний мой пост почитай, я там добавил.
0
-8 / 0 / 0
Регистрация: 27.02.2019
Сообщений: 43
15.03.2019, 16:15  [ТС]
nd2, Да, я забыл, что в исходнике rx и ry - это "10 10".
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
15.03.2019, 16:19
Цитата Сообщение от paradise19 Посмотреть сообщение
Я привел в своём вопросе матрицу с которой хотел выполнить нужные мне действия:
100 200 300 500
1000 500 150 700
2100 1010 1200 400
4000 3000 2000 1000
Размерность, перед этими данными, будет в файле присутствовать?

Добавлено через 2 минуты
Цитата Сообщение от paradise19 Посмотреть сообщение
в дальнейшем это будет указатель размерности.
Так он будет или нет? Если будет, то с ним и приводи пример файла.

Добавлено через 33 секунды
Так?
4 4
100 200 300 500
1000 500 150 700
2100 1010 1200 400
4000 3000 2000 1000
0
-8 / 0 / 0
Регистрация: 27.02.2019
Сообщений: 43
15.03.2019, 16:23  [ТС]
nd2, Да, так.

Добавлено через 2 минуты
nd2, Я запутался в попытке реализации двумерного вектора. Мне нужно получить, что-то вот такое:
[0][1] 100
[0][2] 200
[0][3] 300
[0][4] 500
[1][1] 1000
...
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
15.03.2019, 16:26
Лучший ответ Сообщение было отмечено paradise19 как решение

Решение

Цитата Сообщение от nd2 Посмотреть сообщение
Так?
Если так, то всё ещё проще. Создаешь два вектора: один для int, другой для вектора с int. Читаешь из цикла первые два числа (как и раньше в коде). Делаешь цикл (for) в цикле (for), в первом цикле количество итераций равно первому числу (4), во втором цикле - второму числу (4). Во внутреннем цикле читаешь числа и помещаешь (push_back()) их в вектор int, при выходе из него, во внешнем цикле, помещаешь (push_back()) заполненный вектор в вектор векторов.
1
-8 / 0 / 0
Регистрация: 27.02.2019
Сообщений: 43
15.03.2019, 16:28  [ТС]
nd2, Вообще размерность матрицы может меняться в зависимости от файла? Я так понимаю вы хотите связать условия с размерностью по х и по y.

Добавлено через 50 секунд
nd2, А как вы до этого думали это реализовывать?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
15.03.2019, 16:29
Цитата Сообщение от paradise19 Посмотреть сообщение
Вообще размерность матрицы может меняться в зависимости от файла?
Ты у меня спрашиваешь? Это я у тебя должен узнать. Времени нет. До вечера.
0
-8 / 0 / 0
Регистрация: 27.02.2019
Сообщений: 43
15.03.2019, 16:36  [ТС]
nd2,
Что-то такое?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 QTextStream in(&file); //
        in >> rx; //
        in >> ry; //
        qDebug() <<"rx =" << rx << endl;
        qDebug() <<"ry =" << ry << endl;
        int ch; //
        QVector <QVector <int> > Sbuf;
        while (!in.atEnd()) //
        {
            QVector <int> array; //
            in >> ch; //
            if (in.status() != QTextStream::Ok) //
                break;
          
        for( int i=0; i < rx; i++)
            {
                array.push_back(ch);
                for( int j=0; j < ry; j++)
                 Sbuf.push_back(array);
                qDebug() << "Sbuf[" << i + 1 << "]" << ":" << Sbuf[i][j] << endl;
    }
    }
Добавлено через 3 минуты
nd2,
Цитата Сообщение от paradise19 Посмотреть сообщение
Вообще размерность матрицы может меняться в зависимости от файла? Я так понимаю вы хотите связать условия с размерностью по х и по y.
Я зачем-то вопрос поставил, это утверждение было, но ладно если я считываю эти rx и ry, это не важно.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
16.03.2019, 01:33
Цитата Сообщение от paradise19 Посмотреть сообщение
Что-то такое?
Местами. while() здесь уже не нужен, два вложенных for().
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
16.03.2019, 10:00
1. Можно использовать обычный статический массив размером в максимальный размер матрицы. Если матрица будет меньше, часть массива не будет использоваться.

2. Вложенный вектор:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
    QVector< QVector<int> > spisok;
 
    spisok.resize(5);
 
    for(int i = 0; i < 4; i++)
        for(int j = 0; j < 4; j++)
            spisok[i][j] = i*j;
 
    int n = spisok[2][3];
 
    ui->label_01->setText(QString::number(n));
1
-8 / 0 / 0
Регистрация: 27.02.2019
Сообщений: 43
18.03.2019, 08:40  [ТС]
alexu_007, Я везде пользуюсь дебагами, а вы мне предлагаете ui.
0
285 / 174 / 62
Регистрация: 13.03.2019
Сообщений: 419
18.03.2019, 12:42
Цитата Сообщение от paradise19 Посмотреть сообщение
alexu_007, Я везде пользуюсь дебагами, а вы мне предлагаете ui.
qDebug() << n;

ui - наше "всё". Разве ты ещё не знаком с Qt Designer?
0
-8 / 0 / 0
Регистрация: 27.02.2019
Сообщений: 43
18.03.2019, 14:14  [ТС]
alexu_007, Мне кажется этот пример не подходит к моей программе, по крайней мере у меня ошибка "index out of range"
0
285 / 174 / 62
Регистрация: 13.03.2019
Сообщений: 419
18.03.2019, 15:32
Цитата Сообщение от paradise19 Посмотреть сообщение
alexu_007, Мне кажется этот пример не подходит к моей программе, по крайней мере у меня ошибка "index out of range"
Это потому что он задал размер только внешнего вектора. У него получился вектор, содержащий 5 "пустых" векторов.
1
-8 / 0 / 0
Регистрация: 27.02.2019
Сообщений: 43
18.03.2019, 16:17  [ТС]
nd2,alexu_007, Анна по жизни, Подскажите, вроде всё так делаю, но записывает в массив только из первой строки.

Делал по этой подсказке от nd2:
Если так, то всё ещё проще. Создаешь два вектора: один для int, другой для вектора с int. Читаешь из цикла первые два числа (как и раньше в коде). Делаешь цикл (for) в цикле (for), в первом цикле количество итераций равно первому числу (4), во втором цикле - второму числу (4). Во внутреннем цикле читаешь числа и помещаешь (push_back()) их в вектор int, при выходе из него, во внешнем цикле, помещаешь (push_back()) заполненный вектор в вектор векторов.
C++ (Qt)
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
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) //если файл открыт
    { 
         QTextStream in(&file);
          in >> rx >> ry; 
          qDebug() <<"rx =" << rx << endl;
          qDebug() <<"ry =" << ry << endl;
        int iz; 
        QVector < int > Sbuf;
        QVector < QVector <int> > Mbuf;
 
        for(int i=0; i<rx; i++)
        {
            for(int j=0; j<ry; j++)
            {
               in >> iz;
               Sbuf.push_back(iz);
            }
            Mbuf.push_back(Sbuf);
        }
        for(int i=0; i<Mbuf.size(); i++)
        {
            for(int j=0; j<Mbuf.size(); j++)
            {
               qDebug() << "[" << i << "]" << "[" << j << "]" << Mbuf[i][j];
            }
        }
 
    file.close();
Изображения
 
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
18.03.2019, 16:34
Лучший ответ Сообщение было отмечено paradise19 как решение

Решение

Цитата Сообщение от paradise19 Посмотреть сообщение
вроде всё так делаю
Не так. После Mbuf.push_back(Sbuf), Sbuf очистить нужно (а лучше сразу создать векторы нужных размеров, и читать числа сразу в вектор). И вывод не правильный.

Добавлено через 3 минуты
C++ (Qt)
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
    QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug() << "Error opening file!";
        cin.get();
        return 0;
    }
 
     QTextStream in(&file);
     int rx, ry;
     in >> rx >> ry;
    
     qDebug() << "rx = " << rx;
     qDebug() << "ry = " << ry;
 
     QVector <QVector <int> > vv(rx);
     QVector <int> v(ry);
     
     for (int i = 0; i < rx; ++i)
     {
         for (int j = 0; j < ry; ++j)
            in >> v[j];
         vv[i] = v;
         
     }
     for (int i = 0; i < vv.size(); ++i)
     {
         for ( int j = 0; j < vv[i].size(); ++j)
            cout << vv[i][j] << ' ';
         cout << endl;
         
     }
1
285 / 174 / 62
Регистрация: 13.03.2019
Сообщений: 419
18.03.2019, 16:45
Цитата Сообщение от paradise19 Посмотреть сообщение
for(int i=0; i<Mbuf.size(); i++)
{ for(int j=0; j<Mbuf.size(); j++)
У тебя по i и по j размерности могут быть разные, а ты в условии обоих циклов один и тот же параметр ставишь.

В первом Mbuf.size(), во втором Mbuf.at(i).size().
И да, после запоминания Sbuf в матрицу надо делать Sbuf.clear(). А так у тебя каждая строка матрицы получилась на ry длиннее предыдущей.

И на будущее. Тест, в котором rx == ry, не самый лучший для проверки. Так тяжелее ошибки искать.
1
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
18.03.2019, 21:24
Цитата Сообщение от Анна по жизни Посмотреть сообщение
Это потому что он задал размер только внешнего вектора. У него получился вектор, содержащий 5 "пустых" векторов.
Я бы для решения этой задачи вообще использовал старый добрый двумерный массив, например int x[10][10]. И не заморачивался с векторами, списками и т.п. А максимальный размер матрицы в условии задачи должен быть оговорен.
0
285 / 174 / 62
Регистрация: 13.03.2019
Сообщений: 419
19.03.2019, 10:50
Цитата Сообщение от alexu_007 Посмотреть сообщение
А максимальный размер матрицы в условии задачи должен быть оговорен.
А если не оговорён, что делать будете?
В принципе максимальный размер матрицы и так известен - максимально возможный индекс массива.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2019, 10:50

Куда можно сохранить переменную из файла, чтобы потом к ней обратиться?
Всем привет! По заголовку кто-то заскочил и думает: &quot;Что за тупой вопрос?&quot;, но на самом деле не всё так просто! :D У меня есть парсер, с...

Перенос строк из таблицы одного файла в таблицу другого файла с проверкой на наличие в ней записей
Добрый день. Помогите пожалуйста написать код для переноса строк из таблицы одного файла в таблицу другого файла. Есть 2 файла:...

Чтение значений из файла в переменную
Дан файл input.txt в нем 3 значения{1,2,3} Как сделать так, чтобы в переменные a,b,c записывались соответствующие значения(a=1;b=2;c=3)?

Чтение строки из файла в переменную
Здравствуйте. Т.к. в написании bat файлов нет опыта, необходима помощь. В определенном каталоге по условию появляется текстовый файл...

Чтение из файла и запись в переменную
всем привет) Недавно начал изучение чтение и запись из/в файлы. Вот настряпал небольшой код: #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru