1 / 1 / 0
Регистрация: 08.11.2020
Сообщений: 70

Считывание текста из файла, имя которого было запрошено ранее и проверено на зарезервированность и наличие

05.05.2021, 20:04. Показов 3215. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Молю Вашей помощи, дорогие знатоки Я только учу азы программирования, поэтому прошу сильно не глумиться.
О чем речь...
запрашиваю имя файла, проверяю это имя, чтобы оно не было зарезервированным, проверяю, чтобы файл был в принципе и потом считываю данные из файла в виде массива стрингов. Но, кажется, напрочь перепутала переменные..
Помогите, пожалуйста, исправить полученную помесь непонятных строк кода..

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
char* filename;
            cout << "Пожалуйста, введите имя файла:\n>";
            cin >> filename;
            string* insert = new string[100]; int q;
            if (stricmp(filename, "CON") == 0 || stricmp(filename, "PRN") == 0 || stricmp(filename, "AUX") == 0 || stricmp(filename, "NUL") == 0 || stricmp(filename, "COM1") == 0 || stricmp(filename, "COM2") == 0 || stricmp(filename, "COM3") == 0)
            {
                int y = 1;
                while (y == 1)
                {
                    cout << "Введенное имя зарезервировано. Пожалуйста, переименуйте файл и повторите попытку:\n>";
                    cin >> filename;
                    if (stricmp(filename, "CON") == 0 || stricmp(filename, "PRN") == 0 || stricmp(filename, "AUX") == 0 || stricmp(filename, "NUL") == 0 || stricmp(filename, "COM1") == 0 || stricmp(filename, "COM2") == 0 || stricmp(filename, "COM3") == 0) y = 1;
                    else y = 0;
                }
            }
 
            ifstream file(filename);
            if (file.bad() == true)
            {
                cout << "Пожалуйста, проверьте наличие файла и попробуйте еще раз.\n";
                while (file.bad() == false) ifstream file(filename);
            }
 
            for (int i = 0; i < 100; i++)
            {
                getline(file, insert[i]);
                if (insert[i].length() == 0)           //определение количества строк в файле
                {
                    k = i;
                    break;
                }
            }
            file.close();
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.05.2021, 20:04
Ответы с готовыми решениями:

Считывание данных из файла, имя которого вводится с клавиатуры
Бодрого времени суток. Есть программа, которая считывает данные из файла. Но нужно , чтобы этот файл я ввёл с клавиатуры. Как правильно...

Какое количество таблеток было проверено?
Добрый день! Прошу помощи с решением задачи: При проверке экспериментальной партии таблеток оказалось, что относительная частота...

Определить день, в котрый было больше всего запрошено книг
Дан файл,содержащий данные о выдаче книг в библиотеке. Он содержит дату выдачи,фамилию автора и тематику книги. Определить: a)день, в...

26
1 / 1 / 0
Регистрация: 08.11.2020
Сообщений: 70
05.05.2021, 23:34  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nmcf Посмотреть сообщение
Почему у тебя open() после bad()?
я заменила проверку на наличие файла на "if (file.peek() == std::ifstream::traits_type::eof())"
возникла другая проблема: файл, который есть, считается файлом, которого нет, не находит существующий файл
говорят, проблема в том, что я сначала создаю file для пустого filename,а потом что-то пишу в filename
вот только VS сам потребовал, чтобы я вынесла "ifstream file(filename);" до switch, иначе не запустит
вот.. как быть?
0
1 / 1 / 0
Регистрация: 08.11.2020
Сообщений: 70
05.05.2021, 23:40  [ТС]
по факту, должно быть вот так, но строчку 103 приходится выносить перед switch
Миниатюры
Считывание текста из файла, имя которого было запрошено ранее и проверено на зарезервированность и наличие  
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.05.2021, 23:44
Лучший ответ Сообщение было отмечено E_Kate как решение

Решение

Сначала ifstream file(filename) или open() должен быть для любых чтений и проверок.

Добавлено через 1 минуту
Цитата Сообщение от E_Kate Посмотреть сообщение
но строчку 103 приходится выносить перед switch
Фигурные скобки добавь к case.
0
1 / 1 / 0
Регистрация: 08.11.2020
Сообщений: 70
05.05.2021, 23:59  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Фигурные скобки добавь к case.
это гениально..
теперь он, наконец-то действительно находит этот файл, вот только гадость на этом не закончилась..


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
            if (file.peek() == std::ifstream::traits_type::eof())
            {
                cout << "Пожалуйста, проверьте наличие файла, корректность введенного имени и попробуйте еще раз" << endl;
                d = 1;
            }
            if (d == 1) break;
            file.open(filename);
            string* insert = new string[100]; int q, k;
 
        
            for (int i = 0; i < 100; i++)
            {
                getline(file, insert[i]);
                if (insert[i].length() == 0)           //определение количества строк в файле
                {
                    k = i;
                    break;
                }
            }
            file.close();
 
            cout << k;
            cout << "Текст из выбранного Вами файла: \n\n>";
            for (int i = 0; i < k; i++) cout << insert[i] << endl;
            cout << "\n\n>";
теперь проблема со считыванием файла. В файле 4 строки, выводит k=0, ну и пустой массив соответственно
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,480
06.05.2021, 11:05
Проверки все какие-то мудрёные - не ну логарифмы тоже можно наверное на счётах считать, но зачем, если давно уже придуманы компьютеры?

Добавлено через 39 минут
C++
1
2
3
4
5
6
7
8
9
for (int i = 0; i < 100; i++)    // А откуда вы знаете, что в файле 100 строк?
            {
                getline(file, insert[i]);
                if (insert[i].length() == 0)           //определение количества строк в файле
                {
                    k = i;
                    break;
                }
            }
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,480
06.05.2021, 11:27
Лучший ответ Сообщение было отмечено E_Kate как решение

Решение

немного по getline но если лень читать (мне вот часто лень что то делать ) - то getline() возвращает поток полученных данных. А если данных нет, значит он ничего не вернёт. Отсюда вывод - эту функцию можно воткнуть сразу в условие проверки:

Вот пример подсчёта количества строк в файле
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "rus");
 
    string buffer;
    ifstream file("foobar.txt");
 
    int i = 0;
 
    if (!file.is_open())
        cout << "Ошибка открытия файла!" << endl;    
    else
        for (; getline(file, buffer); i++);
 
    cout << "Строк в файле " << i << endl;   
 
    system("pause");
    return 0; 
}
Тестовый файл во вложении
Вложения
Тип файла: txt foobar.txt (12 байт, 0 просмотров)
0
1 / 1 / 0
Регистрация: 08.11.2020
Сообщений: 70
06.05.2021, 11:47  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Вот
юхууу!
огромное Вам нечеловеческое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.05.2021, 11:47

Как узнать имя контрола, из которого было вызвано событие (например MouseMove)?
Люди подскажите, плиз! Как узнать имя контрола, из которого было вызвано событие (например MouseMove)? Заранее благодарен всем!

Реализовать считывание текста из файла и его хэширование, а не программное считывание
Как реализовать считывание текста из файла и его хэширование, а не программное считывание namespace md5 { class Program ...

Подсчет количества строк в текстовом файле, имя которого задано первым параметром КФ. Проверить наличие указа
Подсчет количества строк в текстовом файле, имя которого задано первым параметром КФ. Проверить наличие указанного файла и вывести...

Посимвольное считывание из файла и проверка на наличие (+ показать количество операторов)
Условия задачи: Из файла необходимо считывать посимвольно (нельзя прочитать сразу весь файл или по строкам). Так же нельзя дублировать...

Объект класса, имя которого хранится в виде текста
Приветствую всех. Возможно ли создать объект класса, если его имя хранится в текстовой переменной? Сразу уточню, что определение этого...


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

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

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер 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) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru