Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/103: Рейтинг темы: голосов - 103, средняя оценка - 4.60
Эксперт 1С
 Аватар для OverDozero
924 / 329 / 130
Регистрация: 07.04.2011
Сообщений: 1,753

Чтение из файла с разделителями

16.12.2014, 16:22. Показов 20578. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Вопрос по чтению из CSV файла с разделителями
Структура файла следующая:
1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;1 7;18;19;20
21;22;23;24;25;26;27;28;29;30;31;32;33;3 4;35;36;37;38;39;40
Каждой строке файла соответствует определенный столбец книги Excel
То есть первая строка в файле - это первый столбец экселя,вторая в файле - второй столбец экселя.
Чтение идет из Экселя по столбцам,а запись в файл столбца производится в строку.
Сохраняю в CSV файл.
Чтение из файла с разделителем
C++
1
2
3
4
5
while (!File.eof())
{
    File.getline(buff,255,';');
    cout << buff << " ";
}
Необходимо считать данные из файла в двумерный массив.Инициализирую и выделяю память

C++
1
2
3
4
5
char **FileArrData = new char *[2];
 for (i = 0; i < FileStrCount; i++)
 {
     FileArrData[i] = new char [20];
 }
Вопрос:Как определить конец строки в файле,при чтении с разделителями,чтобы каждой строке файла соответствовала своя строка в массиве?
Строка 1 в массиве:
1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;1 7;18;19;20
После 20 определить конец строки,увеличить индекс строки и читать далее.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2014, 16:22
Ответы с готовыми решениями:

Чтение из файла с разделителями в массив
Здравствуйте , возникла проблема с чтением из файла. После прочтения в массиве оказываются не те цифры если значение SIZE &gt; 10 ,...

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

Ввод из файла с разделителями
Проблема следующая: как ввести из файла произвольное количество целых чисел, между которыми не пробел, а разделитель (например,...

11
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
16.12.2014, 16:26
Ну если у тебя по 20 чисел в строке, то просто считай сколько раз getline() вызван.
1
39 / 39 / 20
Регистрация: 23.04.2012
Сообщений: 462
Записей в блоге: 2
16.12.2014, 16:30
Лучший ответ Сообщение было отмечено OverDozero как решение

Решение

Функция StrTok

C++
1
2
3
....char razdelitel[]=" ,./;:"; //разделители слов
..... char *P=0; //Указатель для функции strtok
..... P=strtok(S,razdelitel); //Разбиваем исходную строку на слова
1
Эксперт 1С
 Аватар для OverDozero
924 / 329 / 130
Регистрация: 07.04.2011
Сообщений: 1,753
16.12.2014, 16:31  [ТС]
Необязательно 20.Может быть и 100,и 5,и 10000.Неизвестно какой будет файл с данными.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
16.12.2014, 16:35
Тогда сначала считываешь строку, затем делишь на элементы. Сначала
C++
1
File.getline(buff, 255);
Затем, как предложили выше, используешь strtok() как вариант. Или берёшь istringstream, туда строку помещаешь и читаешь через getline() c разделителем ';' до конца.
1
Эксперт 1С
 Аватар для OverDozero
924 / 329 / 130
Регистрация: 07.04.2011
Сообщений: 1,753
16.12.2014, 16:40  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Ну если у тебя по 20 чисел в строке, то просто считай сколько раз getline() вызван.
Вариант подходит,тем более есть переменная,содержащая количество строк в Экселе.Но считать 10 000 раз эту переменную..
Попробую strtok
Спасибо!
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
16.12.2014, 17:54
Как вариант:
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
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <utility>
#include <functional>
#include <string>
#include <algorithm>
#include <cctype>
#include <sstream>
 
int main()
{
   std::ifstream ifs("file.txt");
   if (ifs.is_open()) {
      std::vector<std::vector<int>> matr;
      std::string line;
      while (std::getline(ifs, line))
      {
         std::replace_if(line.begin(), line.end(), std::not1(std::ref(isdigit)), ' ');
         std::istringstream iss{line};
         std::vector<int> curr_row{std::istream_iterator<int>(iss),
                                   std::istream_iterator<int>()};
         matr.emplace_back(std::move(curr_row));
      }
 
      for (auto const& vec : matr) {
         for (int i : vec) std::cout << i << " ";
         std::cout << "\n";
      }
   }
 
   system("pause");
   return 0;
}
0
Эксперт 1С
 Аватар для OverDozero
924 / 329 / 130
Регистрация: 07.04.2011
Сообщений: 1,753
16.12.2014, 19:09  [ТС]
Решил проблему так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int j=0;
char Delimetrs[] = {";\n"};
char *buffdelim;
while (!TempFile.eof())//начало чтения файла
{
    TempFile.getline(buff,255);
    buffdelim = std::strtok(buff,Delimetrs);
     while(buffdelim) {
         j++;
         cout << "J:" <<j <<":";
        cout << buffdelim << endl;
       buffdelim  = strtok(NULL, Delimetrs);    
    }
     j=0;//сброс счетчика
Теперь проблема в том,что в книге Эксель могут содержаться пустые значения(пустые ячейки).
Допустим в первом столбце книги содержится 3 пустых ячейки.Сохраненный файл будет выглядеть так:
1;;;;5;6;7;8;9;10;11;12;13;14;15;16;17;1 8;19;20
Отсутствие значений между разделителями это тоже значение!Пустая ячейка!
В данном коде,при делении строки,не учитывается пустое значение между разделителями.И как следствие,неправильно считается количество j.
Строка состоит из цифр,с 1 до 20.Значит j должно равняться 20.У меня получается j = 17.
Как учесть данный момент,что пустая строка = это тоже значение?И при ее чтении увеличивать j
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
16.12.2014, 19:34
Тогда istringstream и getline() c ';' вместо strtok().
0
Эксперт 1С
 Аватар для OverDozero
924 / 329 / 130
Регистрация: 07.04.2011
Сообщений: 1,753
17.12.2014, 13:56  [ТС]
Решил сделать так,если кому-то интересно:
Чтение данных из ячейки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
wchar_t *get_cell_str( Excel::_WorksheetPtr Sheet, int Row, int Col )
{
    Excel::RangePtr Cell;
    int len;
    Cell = Sheet->Cells->Item[Row][Col];
        if ( *Cell->Text.bstrVal )
    {
        len = wcslen(Cell->Text.bstrVal) + 1;
            wchar_t *res = (wchar_t *)malloc(sizeof(wchar_t) * len);
            wcscpy(res, Cell->Text.bstrVal);
        return res;
    } else
        if (! *Cell->Text.bstrVal )
    {
        len = wcslen(Cell->Text.bstrVal) + 1;
            wchar_t *res = (wchar_t *)malloc(sizeof(wchar_t) * len);
            wcscpy(res, L"&");
        return res;
    }
 
    return NULL;
}
Добавил
C++
1
2
3
4
5
6
7
if (! *Cell->Text.bstrVal )
            {
        len = wcslen(Cell->Text.bstrVal) + 1;
            wchar_t *res = (wchar_t *)malloc(sizeof(wchar_t) * len);
            wcscpy(res, L"&");
        return res;
    }
В итоге в файл,на пустую ячейку пишется "&".И проверяется в момент чтения.
Файл выглядит так:
&;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;1 7;18;19;20
1;&;3;4;5;6;7;8;9;10;11;12;13;14;15;16;1 7;18;19;20
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.12.2014, 14:07
Почему не ноль? У тебя же числа.
0
Эксперт 1С
 Аватар для OverDozero
924 / 329 / 130
Регистрация: 07.04.2011
Сообщений: 1,753
17.12.2014, 14:15  [ТС]
Могут быть и названия,и 0 быть может.А вот & отсутствовать будет всегда! Поэтому 0 писать в файл бессмысленно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2014, 14:15
Помогаю со студенческими работами здесь

Заполнение двумерного статического массива данными из файла с разделителями
В файле text.txt есть строка 0:Ilya:20:Manager, как можно эту строку записать в двумерный динамический массив, где указателем было бы самое...

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

Чтение из файла. Повторное чтение файла
Добрый день. Необходимо реализовать в программе функцию повторного чтения данных из файла, в случае некорректного ввода их в оный. Вот...

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла.
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru