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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.87
Ramoncheg
24 / 17 / 1
Регистрация: 04.03.2013
Сообщений: 170
Записей в блоге: 1
#1

Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. - C++

04.03.2013, 04:25. Просмотров 3050. Ответов 49
Метки нет (Все метки)

Есть текстовый файл, в нем 3 столбца чисел (число строк заранее неизвестно). Напишите пожалуйста код, чтобы первый столбец записывался в 1й массив, второй столбец во 2й массив, а 3й столбец в 3й массив.
Вложения
Тип файла: txt 1.txt (254 байт, 33 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2013, 04:25     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив.
Посмотрите здесь:
Отсортировать по возрастанию первый и второй столбец матрицы C++
Добавить строку/столбец в двумерный массив (Матрицу) C++
Функция добавляет столбец справа в динамический массив C++
Вставьте в массив после каждого столбца из положительных элементов столбец из 0 C++
Сформировать двумерный массив. Удалить из него столбец с заданным но-мером C++
C++ Заполнить массив единицами и вывести в столбец с указанием номера элемента
Создать двумерный массив. Удалить из него строку и столбец с заданным номером C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ramoncheg
24 / 17 / 1
Регистрация: 04.03.2013
Сообщений: 170
Записей в блоге: 1
15.03.2013, 21:56  [ТС]     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #31
Цитата Сообщение от alsav22 Посмотреть сообщение
Как вариант (если не считать количество строк в файле, а создавать массивы с запасом):
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
#include <iostream>
#include <fstream>
#include <windows.h>
#include <cstdlib>
using namespace std;
 
const int N = 100;
 
void show_arr(double* arr, int number)
{
    cout.precision(10);
    cout.showpoint;
    for (int i = 0; i < number; i++)
        cout << arr[i] << endl;
    cout << endl;
}
 
int main()
{
    double arr1[N], arr2[N], arr3[N];
 
    ifstream fin("1.txt");
    
    int i;
    for (i = 0; fin; i++)
    {
        fin >> arr1[i] >> arr2[i] >> arr3[i];
    }
    --i;
    
    show_arr(arr1, i);
    show_arr(arr2, i);
    show_arr(arr3, i);
    
    system("pause");
    return 0;
}
Добавлено через 21 минуту
Если сначала посчитать количество строк с числами в файле (после последней строки с числами не должно быть пустых строк):
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
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <cstdlib>
using namespace std;
 
void show_arr(double* arr, int number)
{
    cout.precision(10);
    cout.showpoint;
    for (int i = 0; i < number; i++)
        cout << arr[i] << endl;
    cout << endl;
}
 
int main()
{
    ifstream fin("1.txt");
 
    string str;
    int arr_size = 0;
    while(fin)
    {
        getline(fin, str);
        if(fin) ++arr_size;
    }
    
    fin.clear();
    fin.seekg(0);
    
    double *arr1 = new double[arr_size];
    double *arr2 = new double[arr_size];
    double *arr3 = new double[arr_size];
    
    for (int i = 0; i < arr_size; i++)
           fin >> arr1[i] >> arr2[i] >> arr3[i];
    
    
    show_arr(arr1, arr_size);
    show_arr(arr2, arr_size);
    show_arr(arr3, arr_size);
 
    delete [] arr1;
    delete [] arr2;
    delete [] arr3;
 
    system("pause");
    return 0;
}

как здесь можно определить количество столбцов, если мы не знаем заранее сколько их ???
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.03.2013, 00:20     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #32
Цитата Сообщение от Ramoncheg Посмотреть сообщение
как здесь можно определить количество столбцов, если мы не знаем заранее сколько их ???
Столбцов или строк? Если столбцов, то:

Цитата Сообщение от Ramoncheg Посмотреть сообщение
Есть текстовый файл, в нем 3 столбца чисел
Если строк, то вопрос уже был и ответ уже был.
Ramoncheg
24 / 17 / 1
Регистрация: 04.03.2013
Сообщений: 170
Записей в блоге: 1
16.03.2013, 09:34  [ТС]     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #33
А если в нем не 3 столбца, а скажем m , и как нам его можно найти, если допустим мы не знаем ни количество строк ни количество столбцов?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.03.2013, 09:46     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #34
Цитата Сообщение от alsav22 Посмотреть сообщение
Как вариант (если не считать количество строк в файле, а создавать массивы с запасом):
Ты серьёзно? Файлы поддерживаются много большего размера, чем память, а не наоборот.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.03.2013, 12:00     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #35
Цитата Сообщение от Ramoncheg Посмотреть сообщение
А если в нем не 3 столбца, а скажем m , и как нам его можно найти, если допустим мы не знаем ни количество строк ни количество столбцов?
Насчёт подсчёта количества строк я уже всё объяснил.

А если в нем нем не 3 столбца, а скажем m
, то посчитать количество чисел в строке. Задача не сложная.
Ramoncheg
24 / 17 / 1
Регистрация: 04.03.2013
Сообщений: 170
Записей в блоге: 1
16.03.2013, 16:39  [ТС]     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #36
Допустим , а как же тогда записать считывание из файла и запись в массив, если мы не знаем сколько этих массивов?

Добавлено через 28 минут
Как я понял сначала нужно найти количество символов, которые находятся через пробел, а потом что делать ?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.03.2013, 20:34     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #37
Цитата Сообщение от Ramoncheg Посмотреть сообщение
Как я понял сначала нужно найти количество символов, которые находятся через пробел, а потом что делать ?
Потом посчитать количество строк и создать соответственное количество массивов, соответственного размера.
Ramoncheg
24 / 17 / 1
Регистрация: 04.03.2013
Сообщений: 170
Записей в блоге: 1
16.03.2013, 21:58  [ТС]     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #38
Цитата Сообщение от alsav22 Посмотреть сообщение
Потом посчитать количество строк и создать соответственное количество массивов, соответственного размера.

а как же сделать , чтобы если мы нашли m ( число столбцов) , оно автоматически создавало столько же массивов, и записывало в них столбы????
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
17.03.2013, 00:09     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #39
Я вот, как еще один вариант, через slice сделал:
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
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <valarray>
 
auto print = [](const std::valarray<double> v)
{
    for (double x : v) std::cout<<x<<" ";
    std::cout<<"\n";
};
 
int main()
{ 
    std::ifstream ofs("D:/some_file.txt");
    if (ofs.is_open())
    {
        std::vector<double> v {std::istream_iterator<double>(ofs), std::istream_iterator<double>()};
        std::valarray<double> data(v.data(), v.size());
        
        unsigned rows = data.size() / 3;
        std::valarray<double> first =    data[std::slice(0, rows, 3)];
        std::valarray<double> second =   data[std::slice(1, rows, 3)];
        std::valarray<double> third =    data[std::slice(2, rows, 3)];
        
        std::cout<<"Results:\n";
        std::cout<<"first:  ";
        print(first);
        std::cout<<"second: ";
        print(second);
        std::cout<<"third:  ";
        print(third);
        
        ofs.close();
    }
    else
        std::cout << "Error opening file\n";
    
    return 0;
}
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 00:17     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #40
Цитата Сообщение от Ramoncheg Посмотреть сообщение
а как же сделать , чтобы если мы нашли m ( число столбцов) , оно автоматически создавало столько же массивов
Создать массив указателей размером m. В цикле выделить, под каждый указатель этого массива, память размером, равным количеству строк в файле.
Ramoncheg
24 / 17 / 1
Регистрация: 04.03.2013
Сообщений: 170
Записей в блоге: 1
17.03.2013, 06:53  [ТС]     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #41
как здесь написать, чтобы выводило количество слов ( состоящих из чисел) в строке???


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
         string str;
    ifstream ifs ("11.txt");
 
 
getline(ifs, str);
      cout << "Result: " << count(str.begin(), str.end(), ' ') << endl;
      system("PAUSE");
    return 0;
}
вот я писал , но это на пробелы

Добавлено через 1 час 19 минут
В этом файле слова в виде чисел записаны не через пробелы , а табуляцией . Можно ли как -то сделать чтобы между ними был 1 пробел??
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 12:21     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #42
Вот так подсчитает, если любые пробельные символы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
string str;
ifstream ifs ("1.txt");
     
int n = 0;
while (true)
{       
    ifs >> str;
    ++n;
    if (ifs.peek() == '\n') break;
}
     
cout << "Result: " << n << endl;
Ramoncheg
24 / 17 / 1
Регистрация: 04.03.2013
Сообщений: 170
Записей в блоге: 1
18.03.2013, 16:40  [ТС]     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #43
Цитата Сообщение от alsav22 Посмотреть сообщение

Если сначала посчитать количество строк с числами в файле (после последней строки с числами не должно быть пустых строк):
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
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <cstdlib>
using namespace std;
 
void show_arr(double* arr, int number)
{
    cout.precision(10);
    cout.showpoint;
    for (int i = 0; i < number; i++)
        cout << arr[i] << endl;
    cout << endl;
}
 
int main()
{
    ifstream fin("1.txt");
 
    string str;
    int arr_size = 0;
    while(fin)
    {
        getline(fin, str);
        if(fin) ++arr_size;
    }
    
    fin.clear();
    fin.seekg(0);
    
    double *arr1 = new double[arr_size];
    double *arr2 = new double[arr_size];
    double *arr3 = new double[arr_size];
    
    for (int i = 0; i < arr_size; i++)
           fin >> arr1[i] >> arr2[i] >> arr3[i];
    
    
    show_arr(arr1, arr_size);
    show_arr(arr2, arr_size);
    show_arr(arr3, arr_size);
 
    delete [] arr1;
    delete [] arr2;
    delete [] arr3;
 
    system("pause");
    return 0;
}

что нужно дописать, чтобы считывать определенную строку ( например 97-ю)??
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2013, 17:33     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #44
C++
1
2
3
4
5
6
7
8
9
10
11
12
ifstream fin("1.txt");
 
string str;
int n = 97;
int arr_size = 0;
while(fin)
{
      getline(fin, str);
      if(fin) ++arr_size;
      if (arr_size == n) break;
}
// если str не пустая, то в ней - 97 строка (строки начинаются с 1)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2013, 09:05     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив.
Еще ссылки по теме:
C++ Отсортируйте каждый нечётный столбец массива по возрастанию (неправильно сортирует массив)
C++ Сформировать двумерный массив. Удалить из него строку и столбец с заданным номером
C++ Массив структур: столбец с номером телефона поставить перед фамилией владельца
C++ Нужно чтобы в матрице столбец менялся на столбец свободных членов
C++ Поменять местами столбец матрицы с наибольшей суммой элементов и заданный столбец (результат не выводится)

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

Или воспользуйтесь поиском по форуму:
Ramoncheg
24 / 17 / 1
Регистрация: 04.03.2013
Сообщений: 170
Записей в блоге: 1
19.03.2013, 09:05  [ТС]     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. #45
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот так подсчитает, если любые пробельные символы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
string str;
ifstream ifs ("1.txt");
     
int n = 0;
while (true)
{       
    ifs >> str;
    ++n;
    if (ifs.peek() == '\n') break;
}
     
cout << "Result: " << n << endl;


Объясни пожалуйста эту строчку . Что за peek() ??

if (ifs.peek() == '\n') break;
Yandex
Объявления
19.03.2013, 09:05     Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив.
Ответ Создать тему
Опции темы

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