Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
1

Проверка конца файла(формат .cvs (таблица MS Excel)

09.08.2019, 09:22. Показов 547. Ответов 13

Есть файл, формата .cvs, который содержит несколько строк, как правильно должен выглядеть цикл проверки не достижения конца файла, чтобы не считывалась лишняя строка в конце?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2019, 09:22
Ответы с готовыми решениями:

Импорт с обновлением из Excel данных файла .cvs в таблицы Access
Здравствуйте, уважаемые знатоки vba. Собственно, мой вопрос вынесен в заголовок. Конкретно меня...

Проверка формы отправки файла на имя и формат файла
Добрый день. Появилась необходимость проверять имя файла и формат перед отправки формы. Пока в...

Проверка на достижение конца файла не рао
ofstream f("tmp"); ifstream idx(idxAdress); int index; idx.seekg(0, ios::end);...

Проверка наличия маркера конца файла
Здравствуйте форумчане! Изучаю тему "Работа с файлами" перепечатал код с учебника,но что-то он не...

13
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
09.08.2019, 09:59 2
Цитата Сообщение от Zohan_LV Посмотреть сообщение
Есть файл, формата .cvs, который содержит несколько строк, как правильно должен выглядеть цикл проверки не достижения конца файла, чтобы не считывалась лишняя строка в конце?
Не обрабатывай пустые строки и всё.
0
Эксперт C
26081 / 16270 / 3495
Регистрация: 24.12.2010
Сообщений: 35,670
09.08.2019, 10:03 3
Zohan_LV, покажите, как делаете вы. А мы попробуем показать, как делать правильно.
И учтите. Флаг EOF выставляется при попытке чтения ЗА пределами файла.

Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Не обрабатывай пустые строки и всё.
В общем случае не самый лучший подход. А что если пустые строки имеют смысл?
0
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
09.08.2019, 10:03  [ТС] 4
Так в том-то и дело, что мне последнюю строку не пустую выводит, а с значениями. При чем значения эти указывают дату 01.01.1970.
0
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
09.08.2019, 10:07 5
Цитата Сообщение от Байт Посмотреть сообщение
В общем случае не самый лучший подход. А что если пустые строки имеют смысл?
В cvs - разве что сакральный. Тем более строка между последним '\n' и EOF

Добавлено через 51 секунду
Цитата Сообщение от Zohan_LV Посмотреть сообщение
Так в том-то и дело, что мне последнюю строку не пустую выводит, а с значениями. При чем значения эти указывают дату 01.01.1970.
Покажи, как начитываешь, да и сам cvs-файл тоже.
0
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
09.08.2019, 10:18  [ТС] 6
Если вкратце о проге: считывание данных из таблицы MS Excel формата .csv. Строка имеет вид, к примеру, "113;partner113;111300;1850040995;1", где первое число записывается в соответствующее поле класса, потом второе и т.д. После считывания каждой строки созданный объект помещается в контейнер std::vector(records)
Пример кода:
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
                       string ex; // специально сделал для проверки на считывание строк
                        while(getline(fin,ex))
            {
 
                Record record;
 
                fin.ignore(1); // поскольку строка начинается с ", я его пропускаю
 
                getline(fin, str, ';');
 
                record.id = atoll(str.c_str());
 
                getline(fin, str, ';');
 
                record.partner = str;
 
                getline(fin, str, ';');
 
                record.number = atoll(str.c_str());
 
                getline(fin, str, ';');
 
                record.date = atoll(str.c_str());
 
                strftime(buf, size(buf), "%Y", localtime(&record.date));  // сначала заносим в буфер исключительно год
 
                time = buf;
 
                record.year = atoll(time.c_str());
 
                strftime(buf, size(buf), "%Y-%m-%d %H:%M:%S", localtime(&record.date)); // потом и всю дату целиком
 
                record.time = buf;
 
                getline(fin, str, '"');
 
                record.status = stoi(str.c_str());
 
                records.push_back(record);
            }
0
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
09.08.2019, 10:22  [ТС] 7
Вот пример файла, только формата другого, потому что .csv сюда нельзя грузить
0
Вложения
Тип файла: xlsx Test1.xlsx (9.4 Кб, 2 просмотров)
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
09.08.2019, 10:30 8
Цитата Сообщение от Zohan_LV Посмотреть сообщение
Пример кода:
Думаю, здесь лучше бы сначала считать полную строку, а потом распарсить её в соответствии с форматом cvs.
Без этих getline(fin, str, ';')
0
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
09.08.2019, 10:32  [ТС] 9
Дело здесь не в том, как именно происходит десериализация, а в том, как проверить на конец файла
0
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
09.08.2019, 10:37 10
Цитата Сообщение от Zohan_LV Посмотреть сообщение
Дело здесь не в том, как именно происходит десериализация, а в том, как проверить на конец файла
Да нет, как раз в этом. Сделай свою "десериализацию" попроще, тогда и проблема уйдёт. Т.е. раздели задачи считывания строки из файла и распарсивания этой строки. Сейчас у тебя всё в куче.
0
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
09.08.2019, 10:41  [ТС] 11
Так я пример привел с одной строкой в файле, а их, к примеру, 100. Не получится распарсить простым getline(fin,str), т.к. считает весь документ. Поэтому я считываю каждый элемент данных в строке до ;, а потом впихиваю его в соответствующее поле.
0
Эксперт C
26081 / 16270 / 3495
Регистрация: 24.12.2010
Сообщений: 35,670
09.08.2019, 10:43 12
Zohan_LV, к сожалению, деталей работы с плюсовыми потоками ввода-вывода не знаю, так как привык к файлам и мне их всегда хватало. На файлах это делается примерно так
C
1
2
3
4
5
6
7
FILE *fin = fopen(nameFile, "r");
while(true) {
  int  c = fgetc(fin): // Ввод символа
    // или fgets - ввод строки
  if (feof(fin)) break; // конец файла
  // Обработка ввода
}
В плюсовых потоках должны быть аналогичные механизмы
0
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
09.08.2019, 11:12  [ТС] 13
Разобрался. Была ошибка в последнем getline, там вместо getline(fin, str, ' " ') должен был стоять getline(fin, str, ';');
0
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
09.08.2019, 11:18 14
Цитата Сообщение от Zohan_LV Посмотреть сообщение
Так я пример привел с одной строкой в файле, а их, к примеру, 100. Не получится распарсить простым getline(fin,str), т.к. считает весь документ. Поэтому я считываю каждый элемент данных в строке до ;, а потом впихиваю его в соответствующее поле.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
    std::ifstream in("C:\\Temp\\test.csv");
    std::string s;
    std::regex rx(R"rx((\"([^\"]*)\"|([^;]*))(;|$))rx");
    while (std::getline(in, s))
    {
        if (s.empty())
            continue;
 
        std::cout << s << std::endl;
        size_t i = 0;
        for (auto it = std::sregex_iterator(s.begin(), s.end(), rx); it != std::sregex_iterator(); ++it, ++i)
        {
            const auto &match = *it;
            const auto &val = match[2].length() == 0 ? match[3].str() : match[2].str();
            std:: cout << '\t' << i << ": " << val << std::endl;
            if (match[4].length() == 0)
                break;
        }
    }
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2019, 11:18

Ограничить формат сохранения файла Excel
Добрый день. Я совершенный «нуб» в VBA. Есть файл .xlsm, который имеет ограниченный доступ...

Скрипт Powershell проверка пользователей в AD по списку cvs
Добрый день. Подскажите пожалуйста, как можно реализовать скрипт, выполняющий поиск по...

Парсинг строк из огромного текстового файла из конца в начало средствами VBA Excel быстро
Хочу поделиться опытом. Была поставлена задача с помощью VBA Excel читать строки из огромного...

Считывание файла *.cvs
*.txt файлы такой код читает правильно: int m; int gist; ifstream f(&quot;1.txt&quot;); for(int i=0;...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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