Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
Nik_001
1 / 1 / 0
Регистрация: 08.02.2017
Сообщений: 21
1

Работа с файлами в С++

06.04.2017, 15:28. Просмотров 1615. Ответов 20
Метки нет (Все метки)

Доброго времени суток! Готовлюсь к зачёту завтра. Там будет задача подобная этой:


Дан текстовый файл "INPUT.txt", где записаны фамилии студентов и их успеваемость. Пример:
Иванов 5 4 3 5 4
Петров 5 5 5 4 4

и так далее...
Необходимо Вывести на экран консоли фамилии отличников.


Код такой:

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
#include <iostream>
#include <fstream>
#include <clocale>
using namespace std;
int main()
{
    setlocale(LC_ALL, "rus");
    ifstream input("INPUT.txt");
    if (!input.is_open())
        cout << "Ошибка! Файлы не найдены! Создайте файлы в корне решения 'проба_3_лабы'" << endl;
    char* buf = new char[255];
    char* x;
    while (input.eof())
    {
        input.getline (buf, 255);
        x = strchr(buf, ' ');
        x += 1;
        int mass[5];
        for (int i = 0; i < 5; i++)
        {
            mass[i] = atoi(buf);
            x += 2;
        }
        bool flag = true;
        for (int i = 0; i < 5; i++)
        {
            if (mass[i] > 3)
                continue;
            else
            {
                flag = false;
                break;
            }
        }
        if (flag)
            cout << buf;
    }
    system("pause");
}
У меня затруднения похоже в глобальном плане. Объясните пожалуйста, при работе с указателем "х", когда мы с помощью
C++
1
strchr()
находим указатель на пробел и перемещаем этот указатель на один пункт, каким образом программа понимает, что ей надо именно с икса дальше читать буфер?
И ещё... Не знаю как сделать вывод фамилии. Ведь когда мы работаем с указателем, он оставшийся буфер стирает
C++
1
x = strchr(buf, ' '); x += 1;
?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2017, 15:28
Ответы с готовыми решениями:

Работа с файлами.
Всем Доброго времени суток. С сегодняшнего дня в инсте стали задавать задачи, на работу с файлами....

Работа с файлами
Доброго времени суток. Нужна ваша помощь в общем есть у нас файл который создан в putti, перед...

Работа с файлами на С++
Здравствуйте ! Написал код программы, что-то на подобии базы данных библиотеки. Осталось только...

Работа с файлами
Здраствуйте! Пож-та помогите понять где допустил ошибку - программировать только начинаю, поэтому...

работа с файлами
подскажите пожалуйста a. В текстовом файле хранятся квадратные вещественные матрицы порядка n (n...

20
nd2
3093 / 2589 / 1132
Регистрация: 29.01.2016
Сообщений: 8,678
06.04.2017, 15:38 2
Зачем всю строку читать? Читай отдельно (input >> ) фамилию, отдельно 5 оценок (input >> ). Чтение фамилии помести в параметры while().
1
Nik_001
1 / 1 / 0
Регистрация: 08.02.2017
Сообщений: 21
06.04.2017, 15:45  [ТС] 3
Простите пожалуйста, а как input будет читать отдельно? Я опять наверное чего - то элементарного недопонимаю.
Вроде же input читает все в строке?
0
nd2
3093 / 2589 / 1132
Регистрация: 29.01.2016
Сообщений: 8,678
06.04.2017, 15:50 4
Цитата Сообщение от Nik_001 Посмотреть сообщение
а как input будет читать отдельно?
C++
1
input >> buf
Цитата Сообщение от Nik_001 Посмотреть сообщение
Вроде же input читает все в строке?
Это getline() читает всю строку, оператор >> читает до пробела.
1
06.04.2017, 15:50
Nik_001
1 / 1 / 0
Регистрация: 08.02.2017
Сообщений: 21
06.04.2017, 15:53  [ТС] 5
Спасибо большое, сейчас переделаю)
0
liv
1884 / 1410 / 228
Регистрация: 07.10.2015
Сообщений: 3,566
Завершенные тесты: 1
06.04.2017, 15:57 6
Nik_001, примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream input("INPUT.txt");
    if (!input.is_open())
        cout << "Error" << endl;
    char* name = new char[255];
    int mass[5];
 
    while (input >> name)
    {
        input >> mass[0] >> mass[1] >> mass[2] >> mass[3] >> mass[4];
        //что-то делаем
    }
}
1
MrGluck
Форумчанин
Эксперт CЭксперт С++
8134 / 4985 / 1436
Регистрация: 29.11.2010
Сообщений: 13,456
06.04.2017, 16:01 7
C++14
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
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
#include <windows.h>
 
struct Student
{
    std::string surname;
    bool good;
};
 
std::istream& operator >> (std::istream &in, Student &st)
{
    st.good = true;
    in >> st.surname;
    for (int i = 0, x; i < 5 && in >> x; i++)
        if (x < 5)
            st.good = false;
    return in;
}
 
std::ostream& operator << (std::ostream &out, const Student &st)
{
    return out << st.surname << std::endl;
}
 
int main()
{
    std::ifstream ifs("input.txt");
    if (!ifs)
        return 1;
    setlocale(LC_ALL, "");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    using input_it = std::istream_iterator<Student>;
    std::copy_if(input_it(ifs), input_it(), std::ostream_iterator<Student>(std::cout),
        [](const auto &st) { return st.good; });
}
1
Nik_001
1 / 1 / 0
Регистрация: 08.02.2017
Сообщений: 21
06.04.2017, 16:02  [ТС] 8
Цитата Сообщение от _liv_ Посмотреть сообщение
(input >> name)
Немного не понял. Пока в while передается что-то заполняем массив mass?
Похоже я совсем нуб
0
Даценд
Модератор
Эксперт .NET
5055 / 4310 / 2798
Регистрация: 20.04.2015
Сообщений: 7,769
06.04.2017, 16:06 9
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
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <windows.h>
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    std::ifstream in("d://input.txt", std::ios_base::in);
    std::string line, name;
    int score;
    bool isExcellent;
    while(std::getline(in, line))
    {
        std::istringstream linestream(line);
        linestream >> name;
        isExcellent=true;
        while (linestream >> score)
        {
            if (score!=5)
            {
                isExcellent=false;
                break;
            }
        }
        if(isExcellent)
            std::cout << name << std::endl;
    }
    return 0;
}
1
Nik_001
1 / 1 / 0
Регистрация: 08.02.2017
Сообщений: 21
06.04.2017, 16:07  [ТС] 10
MrGluck, почему все так страшно?) без
C++
1
using namespace std;
код выглядит непривычно)
Стуктуры мы на момент сдачи этого задания ещё не прошли, поэтому их использовать не желательно, извините)
0
liv
1884 / 1410 / 228
Регистрация: 07.10.2015
Сообщений: 3,566
Завершенные тесты: 1
06.04.2017, 16:08 11
Цитата Сообщение от Nik_001 Посмотреть сообщение
Немного не понял
Если прочитается имя, то вернется нечто не 0.
Отработает тело while, в котором прочитаем остальные поля строки.
Если имя не прочитается (файл закончился), то вернется 0, по которому выйдем из цикла while
1
Nik_001
1 / 1 / 0
Регистрация: 08.02.2017
Сообщений: 21
06.04.2017, 16:09  [ТС] 12
Даценд, много незнакомых библиотек, если спросят, не смогу объяснить. И функций много незнакомых. Я просто 1 курс...)

Добавлено через 1 минуту
Простите, нужно отлучиться.
0
nd2
3093 / 2589 / 1132
Регистрация: 29.01.2016
Сообщений: 8,678
06.04.2017, 16:10 13
Цитата Сообщение от Nik_001 Посмотреть сообщение
много незнакомых библиотек, если спросят, не смогу объяснить. И функций много незнакомых. Я просто 1 курс...)
Свой код переделывай, _liv_ показал направление. Только buf не делай в куче, это ни к чему.
Цитата Сообщение от Nik_001 Посмотреть сообщение
Немного не понял. Пока в while передается что-то заполняем массив mass?
Прочитал фамилию, потом прочитал пять чисел в массив, проанализировал числа в массиве, если то - вывел фамилию, если не то, следующее чтение фамилии, и т.д.
0
Nik_001
1 / 1 / 0
Регистрация: 08.02.2017
Сообщений: 21
06.04.2017, 16:10  [ТС] 14
_liv_, спасибо, как вернусь, попробую сделать)

Добавлено через 24 секунды
nd2, тоже спасибо)
0
liv
1884 / 1410 / 228
Регистрация: 07.10.2015
Сообщений: 3,566
Завершенные тесты: 1
06.04.2017, 16:12 15
Цитата Сообщение от Nik_001 Посмотреть сообщение
почему все так страшно?
MrGluck, Даценд, требуется код как можно проще, как для новичка...
0
MrGluck
Форумчанин
Эксперт CЭксперт С++
8134 / 4985 / 1436
Регистрация: 29.11.2010
Сообщений: 13,456
06.04.2017, 16:34 16
Цитата Сообщение от Nik_001 Посмотреть сообщение
MrGluck, почему все так страшно?
потому что у вас пока нет опыта.
Цитата Сообщение от Nik_001 Посмотреть сообщение
код выглядит непривычно
зато правильно

Цитата Сообщение от _liv_ Посмотреть сообщение
требуется код как можно проще, как для новичка...
там максимально просто, всё выполнение в одной инструкции copy_if.
0
liv
1884 / 1410 / 228
Регистрация: 07.10.2015
Сообщений: 3,566
Завершенные тесты: 1
06.04.2017, 16:57 17
Цитата Сообщение от MrGluck Посмотреть сообщение
там максимально просто, всё выполнение в одной инструкции copy_if.
Дело ж не в выполнении, а в понимании и в объяснении преподавателю. Предлагаете ТС блеснуть информацией, которую еще не проходили?
0
MrGluck
Форумчанин
Эксперт CЭксперт С++
8134 / 4985 / 1436
Регистрация: 29.11.2010
Сообщений: 13,456
06.04.2017, 17:07 18
Цитата Сообщение от _liv_ Посмотреть сообщение
Предлагаете ТС блеснуть информацией, которую еще не проходили?
А что в этом плохого? Если изучит материал самостоятельно, а не начнёт сдавать код в котором не разбирается, то можно и "блеснуть".
0
liv
1884 / 1410 / 228
Регистрация: 07.10.2015
Сообщений: 3,566
Завершенные тесты: 1
06.04.2017, 17:21 19
Цитата Сообщение от MrGluck Посмотреть сообщение
А что в этом плохого?
Если изучит материал, то плохого ничего
0
Nik_001
1 / 1 / 0
Регистрация: 08.02.2017
Сообщений: 21
06.04.2017, 20:41  [ТС] 20
_liv_, MrGluck, конечно плохого ничего нет, я согласен, но насколько я понял, преподаватель хочет от меня, чтобы я все таки использовал strchr() и atoi(). Конечно, главная черта программиста - самообучаемость. Но пока катострофически не хватает времени.
Как работают функции я понял, а вот вопросы плана: как в буфер занести фамилию, если он, по - моему, очищает его после перемещения указателя, остались неразрешенными...

Добавлено через 6 минут
Даценд, кстати, отбросив эти std::, я понял, что Ваш код очень понятен. Просто разве что преподаватель не разрешает нам использовать тип данных string. Поэтому я ввел аналог этой строке буфер buf, в который я считываю по одной строке. Ну Вы и так конечно же поняли))
0
06.04.2017, 20:41
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2017, 20:41

Работа с файлами
У меня есть файл, в котором по строкам записана дата, а после любое число. Примерно так:...

Работа с файлами
Задание : напишите программу, которая объединяет возможности программ “Добавление в файл” и “Поиск...

Работа с файлами
ДОБРЫЙ ВЕЧЕР! Такая задачка.. Написать программу по созданию базы данных ( например: имя,...


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

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

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