Форум программистов, компьютерный форум, киберфорум
acmades
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

С++ «Неделя четвертая - Работа с текстовыми файлами и потоками - Работа с файлами» #19

Запись от acmades размещена 22.08.2017 в 21:51
Показов 31205 Комментарии 3

Потоки прикольная штука. Вот новое задание:
В этом задании вам предстоит написать две небольшие программы. Каждый пункт - отдельная задача, решение отправляйте в поле с соответствующим номером.
Часть 1

Ваша программа должна считать содержимое файла input.txt и напечатать его на экран без изменений. Гарантируется, что содержимое файла input.txt заканчивается переводом строки.

Пример
input.txt
C++
1
2
3
Kepp calm
and
learn C++
stdout
C++
1
2
3
Kepp calm
and
learn C++
Часть 2

Снова считайте все содержимое файла input.txt, но на этот раз выведите его в файл output.txt . Точно так же гарантируется, что содержимое файла input.txt заканчивается переводом строки.

Пример
input.txt
C++
1
2
3
Kepp calm
and
learn C++
output.txt
C++
1
2
3
Kepp calm
and
learn C++
Моё решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main() {
    ifstream input("input.txt");
    string line;
    ofstream output("output.txt", ios::app);
    while (getline(input, line)) {
        cout << line << "\n"; //закомментируем эту строку, для 2 части
        output << line << "\n"; //закомментируем эту строку, для 1 части
    }
    return 0;
}
В продолжение темы:
Задание:
В файле input.txt записаны вещественные числа, по одному на строчку. На стандартный вывод напечатайте эти числа в том же порядке, по одному на строке, но сделайте так, чтобы у каждого из них было ровно три знака после десятичной точки (округление производится по стандартным правилам, т.е. 0.1234 округляется до 0.123, а 0.1235 до 0.124).
Пример ввода
C++
1
2
3
4
5
6
5
0.34567
10.4
3.33353
3.333
3.3
Пример вывода
C++
1
2
3
4
5
6
5.000
0.346
10.400
3.334
3.333
3.300
Моё решение:
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
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
 
int main() {
    ifstream input("input.txt"); //входной поток из файла
    string line;
    while (getline(input, line)) { //пока не кончатся строки
        //тут я порылся в инете(с мыслью конвертировать строки в число), и нашел интересность ниже
        double dline = atof(line.c_str()); //любопытная штукенция для конвертации
        cout << fixed << setprecision(3); //как положено, 3 знака после точки
        cout << dline << "\n";
    }
    return 0;
}
//или можно было так
/*int main() {
    ifstream input("input.txt");
    double line;
    cout << fixed << setprecision(3);
    while (input) {
        input >> line;
        cout << line << endl;
    }
    return 0;
}*/
И ещё задание:
В первой строке файла input.txt записаны два числа N и M. Далее в файле находится таблица из N строк и M столбцов, представленная в формате CSV (comma-separated values). Такой формат часто используется для текстового представления таблиц с данными: в файле несколько строк, значения из разных ячеек внутри строки отделены друг от друга запятыми. Ваша задача — вывести данные на экран в виде таблицы, размер ячейки которой равен 10, соседние ячейки отделены друг от друга пробелом. После последней ячейки пробела быть не должно. Гарантируется, что в таблице будет ровно N строк и M столбцов, значение каждой из ячеек — целое число.
Пример ввода
C++
1
2
3
2 3
1,2,3
4,5,6
Пример вывода
C++
1
2
         1          2          3
         4          5          6
Моё решение:
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
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
int main() {
    ifstream input("input.txt");
    string lines;
    int N, M;
    //подумал. что надо сначала перевести первые 2 параметра из строки в число и сначала сделал так...
    /*getline(input, lines, ' '); //взять строку до пробела
    N = atoi(lines.c_str()); //перевести её в число
    getline(input, lines); //взять оставшееся и
    M = atoi(lines.c_str());*/ //тоже перевести в число
    //но оказалось можно и проще
    input >> N >> M; // )))))
    input.ignore(1); //еще перевод строки остался, его игнорируем(иначе выведется)
    for (int i = N; i > 0;--i) {
        for (int z = M; z > 1; --z) {
            getline(input, lines, ',');
            cout << setw(10) << lines << " ";
        }
        getline(input, lines);
        cout << setw(10) << lines << endl;
    }
    return 0;
}
Продолжение смотрите в блоге...
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 3
Комментарии
  1. Старый комментарий
    atof(.c.str) надо взять на заметку, у вас писанины меньше)
    Запись от Albatrosso размещена 23.08.2017 в 08:34 Albatrosso вне форума
  2. Старый комментарий
    Аватар для Avazart
    Файл имеет свойство кончатся ...
    Это надо проверять, нужно проверять состояние потока при чтении.

    atof(.c.str) надо взять на заметку, у вас писанины меньше)
    Мое мнение позорная ф-ция.
    Нельзя достоверно узнать произошло ли преобразование успешно или возникла ошибка.
    Запись от Avazart размещена 23.08.2017 в 13:33 Avazart вне форума
  3. Старый комментарий
    Цитата Сообщение от Avazart
    Файл имеет свойство кончатся ...
    Это надо проверять, нужно проверять состояние потока при чтении.
    А вот так разве не проверяется?
    C++
    1
    
    while (getline(input, line))
    или
    C++
    1
    
    while (input)
    А про "интересную" функцию atof(line.c_str()) сомневался сначала, но переводит она нормально. Тем более в условии написано что в файле именно вещественные числа и ничего больше. Иначе бы еще условие было на корректность данных.
    Неужели эта строчка надежнее?
    C++
    1
    
    input >> line;
    Запись от acmades размещена 24.08.2017 в 13:06 acmades вне форума
 
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru