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

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

05.05.2021, 20:04. Показов 3165. Ответов 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,474
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,474
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
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru