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

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

16.12.2014, 16:22. Показов 20539. Ответов 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,747
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,747
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,747
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,747
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,747
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru