Форум программистов, компьютерный форум, киберфорум
Наши страницы
acmades
Войти
Регистрация
Восстановить пароль
Оценить эту запись

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

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

Потоки прикольная штука. Вот новое задание:
В этом задании вам предстоит написать две небольшие программы. Каждый пункт - отдельная задача, решение отправляйте в поле с соответствующим номером.
Часть 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 на форуме
    Обновил(-а) Avazart 23.08.2017 в 13:36
  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 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru