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

Разработать программу, которая создёт новый файл из значений исходного по некоторому правилу

05.11.2022, 18:44. Показов 4863. Ответов 42

Студворк — интернет-сервис помощи студентам
Всем привет. Это снова я, который пытается понять и освоить программирование в тех. вузе, где ничего особо не объясняется . В общем опять тема потоков. В методичке написано, что задание на потоки и что рекомендовано использовать:

istrstream
ostrstream
strstream
ifstream
ofstream
fstream
constream

Пока примерно понял как создавать файл, проверять открыт ли он и закрывать. В душе не чаю что требуется в задании

Требуется разработать программу управления текстовым файлом.

Требования(по методичке):
1. Реализация ввода-вывода на основе файловых потоков С++: ofstream, ifstrim.
2. Имя физического файла вводится пользователем и передается в функции обработки через параметр.
3. При открытии файла выполнять контроль его существования и открытия.
Примечание. При отладке программы можете имя физического файла определить через константу.
4. Разработать функции для выполнения операций над текстовым файлом.
1) создание текстового файла средствами текстового редактора кодировки ASCII, содержащего десятичные числа по несколько чисел на строке;
2) вывод содержимого текстового файла;
3) добавление новой записи в конец файла;
4) прочитать значение числа, указав его порядковый номер в файле, и вернуть его значение;
5) определить количество чисел в файле.
5. Разработать приложение и выполнить тестирование всех функций. Приложение должно содержать диалоговый интерфейс на основе текстового меню.
6. Контроль открытия и существования файла выполнить в основной программе перед вызовом функции. Перед закрытием файла, проверить отсутствие ошибок ввода и вывода (метод good)/
7. Создать модуль и перенести в него все отлаженные функции. Исключить функции из приложения. Отладить приложение, подключив к нему модуль с функциями.
8. Разработать функции для реализации дополнительных операций, определенных вариантом и сохранить их в модуле с остальными функциями.
9. Выполнить тестирование приложения в полном объеме.

Само задание звучит так:

Создать новый файл из значений исходного, по правилу: третья часть содержимого исходного файла должна стать первой частью нового файла, а две первых исходного должны расположиться после первой в новом файле.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.11.2022, 18:44
Ответы с готовыми решениями:

Разработать программу преобразования исходного текстового файла в новый файл, которая будет выполнять задан
Из двух исходных строк, идущих друг за другом сформировать одну, если их суммарная длина менее 70 символов.

Написать программу, которая формирует новый файл последовательного доступа из произведений компонент исходного файла,
Написать программу, которая формирует новый файл после¬довательного доступа из про¬изведений компонент исходного файла, следующим образом:...

Сформировать из исходного файла новый файл по заданному правилу
Здравствуйте. Помогите пожалуйста с данной программой. В задаче используются только последовательные файлы. Программа должна: запрашивать...

42
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
06.11.2022, 01:14
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от daniil_novel Посмотреть сообщение
Типо, если мы открываем файл что на запись, что на чтение, если файла нет, то компилятор его должен создать.
Не должен. В том то и соль.

Цитата Сообщение от daniil_novel Посмотреть сообщение
Я исправил, но ошибка в get не ушла
Цитата Сообщение от daniil_novel Посмотреть сообщение
"\n"
Вы символ сравниваете со строкой. Устали уже, наверное.

'\n'

Добавлено через 1 минуту
str.get() тут вы наверное у потока хотели взять символ. а пытаетесь взять у строки...

Добавлено через 3 минуты
Может вы хотели выйти при вводе пустой строки ?
if(str.empty())
break;
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
06.11.2022, 01:17  [ТС]
Да, касаемо скобок действительно устал). А str.get() я просто не до конца понимаю суть работы функции get(). То есть мне нужно дать какое-то условие, что пока мы не введем энтер, мы записываем в файл данные. Я пожумал, что гет будет читать посимвольно и тут бац, и "/n". Пробовал, но читает безтустали и вообще не останавливается. Когда просто убрал гет и стал сравнивать не с /n, а с нулем, то всё заработало, но с 0 слишком просто. Хочу добить , чтобы по энтеру прекращался ввод)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
06.11.2022, 01:23
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
using namespace std;
 
int main(){
    string line;
    cout << "Enter empty line to skip input\n" << endl;
    while(getline(cin, line) && !line.empty())
        cout <<  line << endl;
}
1
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
06.11.2022, 01:44  [ТС]
Как-то сложно
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
06.11.2022, 02:12  [ТС]
Начал я тестировать всё это дело, а там какое-то суровое наказания для меня же. Функция readTextFile() походу вообще не работает и всегда выдаёт нулевое значение буфера. Функция же addNotetoEndFile() после того, как я ввожу числа печатает строку с ними же, просто выводит на экран, хотя я этого не просил. Потом, после завершения программы выводятся остальные сообщения из мейна. Заглянул в txt файл, а он вообще пустой как ни в чём не бывало. Это получается, что и проверки на то, есть ли у нас уже этот файл, работают неправильно. Не представляю откуда такое вообще может быть. На всякий скину код. Мб там есть что-то очень уж страшное, что всё ломает, но пока я ни одной ошибки дебагом не нашел

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>  
 
using namespace std;
 
int createTextFile(string fileName) {
    ofstream file(fileName); // открываем файл на ввод
    if(file.is_open()) {
        file.close();
        cout << "Открыли" << endl;
        return 0;
    } else {
        file.close();
        cout << "Открыли еще раз" << endl;
        ofstream fileTwo(fileName);
        fileTwo.close();
        return 1;
    }
}
 
int readTextFile(string fileName) {
    ifstream file;
    file.open(fileName);
    int buf = 0;
 
    if(!file.is_open()) {
        cout << "Ошибка открытия" << endl;
        file.close();
        return 0;
    } else {
        cout << "Файл открыт и считан:" << endl;
        do {
            file >> buf;
            cout << buf << " ";
        } while(!(file.eof()));
 
        cout << endl;
        file.close();
        return 1;
    }
}
 
int addNotetoEndFile(string fileName) {
    ofstream file(fileName, ios::ate); // открываем файл на дозапись
    string line;
    if(file.is_open()) {
        cout << "Enter empty line to skip input\n" << endl;
        while(getline(cin, line) && !line.empty())
            cout << line << endl;
        file.close();
    }
    system("pause");
    return 0;
}
 
int main() {
    setlocale(LC_ALL, "rus");
    string fileName = "BaseFile.txt";
    createTextFile(fileName);
    printf("Функция создания файла отработала\n");
    readTextFile(fileName);
    printf("Функция чтения из файла отработала \n");
    addNotetoEndFile(fileName);
    printf("Функция дописывания в файл отработала \n");
    readTextFile(fileName);
    printf("Функция чтения из файла отработала\n");
    return 0;
}
Миниатюры
Разработать программу, которая создёт новый файл из значений исходного по некоторому правилу  
0
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,751
06.11.2022, 06:44
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int readTextFile(string fileName) {
    ifstream file;
    file.open(fileName);
    int buf = 0;
 
    if(!file.is_open()) {
        cout << "Ошибка открытия" << endl;
        file.close();
        return 0;
    } 
   else {
        while (file >> buf)
            cout << buf << ' ';
            cout << "Файл открыт и считан:" << endl;
        cout << endl;
        file.close();
        return 1;
    }
}
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
06.11.2022, 16:30  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
cout <<  line << endl;
Не понимаю. Зачем нам эта строчка? Она же просто дублирует на экран то, что мы ввели?

Добавлено через 2 часа 8 минут
Не понимаю почему, но почему-то функция не дописывает в файл, если он пустой
0
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,751
06.11.2022, 17:08
а что мешает написать
C++
1
file <<  line << endl;
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,349
06.11.2022, 21:36
Цитата Сообщение от daniil_novel Посмотреть сообщение
Создать новый файл из значений исходного, по правилу: третья часть содержимого исходного файла должна стать первой частью нового файла, а две первых исходного должны расположиться после первой в новом файле.
Сразу вопросы к заданию:
тип исходного файла
тип значений в исходном файле
если файл текстовый, то указать разделители между значениями
как поступать, если количество значений не делится нацело на три
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
06.11.2022, 22:21
Цитата Сообщение от alexu_007 Посмотреть сообщение
тип исходного файла
Цитата Сообщение от daniil_novel Посмотреть сообщение
разработать программу управления текстовым файлом
Цитата Сообщение от alexu_007 Посмотреть сообщение
тип значений в исходном файле
Цитата Сообщение от daniil_novel Посмотреть сообщение
десятичные числа
Цитата Сообщение от alexu_007 Посмотреть сообщение
если файл текстовый, то указать разделители между значениями
Цитата Сообщение от daniil_novel Посмотреть сообщение
по несколько чисел на строке;
Стандартные разделители - управляющие символы : пробел, табуляция, перенос строки, и т.д.
Цитата Сообщение от alexu_007 Посмотреть сообщение
как поступать, если количество значений не делится нацело на три
Элементарно, с помощью целочисленного деления.
То есть, файл из двух элементов и меньше, не породит новый файл. Нечего делить.

Как возможные ответы.
Легче стало ?
Мне вот нет. Задание - переливать воду из пустого в порожнее.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,349
06.11.2022, 23:16
Цитата Сообщение от SmallEvil Посмотреть сообщение
Легче стало ?
А в чём собственно проблема? Прочитать файл в байтовый контейнер, разделить числа по стандартным разделителям, сбросить в строковый контейнер, поделить на три и сформировать новый файл по заранее утверждённым правилам.

Ну заодно уточнить, как относиться к тому, если в исходном файле окажутся не только цифры, но и другие символы (буковы)?
Выдавать сообщение об ошибке, игнорить, или что?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
06.11.2022, 23:21
Цитата Сообщение от alexu_007 Посмотреть сообщение
Выдавать сообщение об ошибке, игнорить, или что?
Да, выдать сообщение и прекратить работу программы. Файл поврежден/(не соответствует формату).
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,349
06.11.2022, 23:35
А задание - это то что жирным шрифтом в конце, или всё? Потому что:

4. Разработать функции для выполнения операций над текстовым файлом.
1) создание текстового файла средствами текстового редактора кодировки ASCII, содержащего десятичные числа по несколько чисел на строке;
Предполагается написание собственного текстового редактора, или, как минимум, вызов из своей программы стороннего приложения?
7. Создать модуль и перенести в него все отлаженные функции. Исключить функции из приложения. Отладить приложение, подключив к нему модуль с функциями.
А это, как я понял - создать библиотеку?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
06.11.2022, 23:53
alexu_007,
Это копипаст из методички.
Цитата Сообщение от alexu_007 Посмотреть сообщение
Предполагается написание собственного текстового редактора, или, как минимум, вызов из своей программы стороннего приложения?
Это подготовить файл с данными. С помощью текстового редактора

Цитата Сообщение от alexu_007 Посмотреть сообщение
А это, как я понял - создать библиотеку?
Нет, просто вынести в отдельный файл-модуль

Добавлено через 3 минуты
Цитата Сообщение от alexu_007 Посмотреть сообщение
А в чём собственно проблема?
Так и нет никаких проблем.
Читаешь, пишешь, пишешь, читаешь.

Запросили +100500 число из файла, читаешь весь файл

Да, тут без пол-литра и Сектор Газа делать нечего.
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
07.11.2022, 16:48  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Да, тут без пол-литра и Сектор Газа делать нечего.
Да уж. Дальше хуже. Я вроде реализовал эти 4 будь они неладны функции из требования в методичке и теперь делаю само задание. Я думал, что эти функции хоть как-то пригодятся, но получается, что вообще никак, хотя все их делают и их надо будет сдавать. Мало того, что у меня до сих пор не заработала функция addNotetoFile, так она и не пригодится еще. Мдаа

Добавлено через 3 минуты
А ещё у меня с ума сошел сам файл .txt . Открываю его на дозапись, а он просто стирает всё то, что в файле и нифига туда не записывает. Я хотел написать функцию дозаписи в конец файла, а получилась функция очистки файла и это еще при том при всём, что я в адеквате и думаю что делаю. Наверное...

Добавлено через 1 час 12 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
while(fin>>num)
   fout << num << ' ';
Чего-то я прямо сильно запутался как оно работает. То есть мы, конечно, можем идти только через перенаправление ввода-вывода, но почему бы не использовать те функции, которые вы применяли в прошлой работе? Tellg, seekg
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.11.2022, 16:57
Цитата Сообщение от daniil_novel Посмотреть сообщение
почему бы не использовать те функции, которые вы применяли в прошлой работе? Tellg, seekg
Потому что, в этой задаче, мы не знаем нужных позиций
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
07.11.2022, 17:16  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Потому что, в этой задаче, мы не знаем нужных позиций
Но мы же можем их высчитать и сдвинуться? Или seekg и tellg вообще только для бинарных файлов?

Добавлено через 4 минуты
Когда мы смещаемся вперед, мы просто в никуда читаем файл тем самым переходя на следующие числа. А как нам сместиться назад. Я застрял с тем, что мне нужно снова оказаться на начальной позиции в файле и читать его первые две трети. Неужели нет функции управления курсором для считывания? Ну или может можно читать в другую сторону?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.11.2022, 17:46
Лучший ответ Сообщение было отмечено daniil_novel как решение

Решение

Основное задание :
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
41
42
43
44
45
46
47
#include <iostream>
#include <fstream>
 
using namespace std;
using bostream = basic_ostream<char>;
using bistream = basic_istream<char>;
using biostream = basic_iostream<char>;
 
size_t count_numbers(bistream& fin){
    size_t numbers = 0;
    double num;
    fin.seekg(0);
    while(fin>>num)
        ++numbers;
    return numbers;
}
bistream& seek_by_number(bistream& fin, size_t pos){
    double num;
    while(pos-- && fin>>num)
        ;
    return fin;
}
 
int main()
{
    ifstream fin("numbers.txt");
    if (fin.is_open()){
        size_t numbers = count_numbers(fin);
        size_t third_part_pos = numbers - numbers/3;
        
        double num;
        size_t i = third_part_pos;
        fin.clear();
        fin.seekg(0);
        ofstream fout("output.txt");
        
        if (seek_by_number(fin, third_part_pos)){
            while(fin>>num)
                fout << ' ' << num;
        }
        fin.clear();
        fin.seekg(0);
        i = third_part_pos;
        while(i-- && fin>>num)
            fout << ' ' << num;
    }
}
Добавлено через 1 минуту
Цитата Сообщение от daniil_novel Посмотреть сообщение
Но мы же можем их высчитать и сдвинуться? Или seekg и tellg вообще только для бинарных файлов?
Обычно для бинарных. Также для индексированных.

Цитата Сообщение от daniil_novel Посмотреть сообщение
Но мы же можем их высчитать и сдвинуться?
Я не придумал как ? )

Добавлено через 2 минуты
Цитата Сообщение от daniil_novel Посмотреть сообщение
Я застрял с тем, что мне нужно снова оказаться на начальной позиции в файле и читать его первые две трети.
C++
1
2
3
        fin.clear(); // очищаем флаги ошибок и состояния, конец файла
        fin.seekg(0); // смещаем на начало, только для ifstream и fstream, 
// вроде для ostream тоже, кроме открытия на добавление, хотя тут точно не помню.
1
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
07.11.2022, 18:02  [ТС]
Спасибо. Сейчас все должно получиться будет. Касаемо просчёта позиций, их там не получится просчитать. Я ошибся)
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
07.11.2022, 18:49  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Основное задание :
Спасибо огромное, что написали основное задание))). Я все же постарался и довёл своё решение. Оно заработало и я просто счастлив. Как вам?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int personalTask(string fileName) {
    ofstream fout("OutFile.txt");
    ifstream fin(fileName);
 
    int buf = 0;
    int numCount = numInFile(fileName); // 6
    int firstTwoPart = 2 * numCount / 3;
    int lastThirdPart = numCount - numCount / 3; // 4
 
    int i = lastThirdPart; // 4
    while(fin >> buf && --i); // сместились на 4 числа
    while(fin >> buf) {
        fout << buf << ' ';
    }
 
    fin.clear(); // очищаем флаги ошибок и состояния, конец файла
    fin.seekg(0); // смещаем на начало, только для ifstream и fstream, 
    while(fin >> buf && firstTwoPart--)
        fout << buf << " ";
    return 0;
}
Миниатюры
Разработать программу, которая создёт новый файл из значений исходного по некоторому правилу  
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2022, 18:49

Написать программу, которая формирует новый текстовый файл из исходного файла, удаляя из него все знаки математических операций («*», «/», «+», «–
Создать в программе Блокнот текстовый файл. Написать программу, которая формирует новый текстовый файл из исходного файла, удаляя из него...

Написать программу, которая формирует новый файл последовательного доступа, в котором исключены повторные вхождения компонент исходного файла последов
Написать программу, которая формирует новый файл последовательного доступа, в котором исключены повторные вхождения компонент исходного...

Сформировать новый список из данного по некоторому правилу
Добрый день ! Не могли бы вы помочь со следующей задачей: На основе данного списка сформировать новый, содержащий сначала элементы...

Разработать программу, которая строит логический вектор L(n) по правилу
Помогите с программой, пожалуйста. Заданная матрица,X(n,n),n&lt;=15. Разработать программу, которая строит логический вектор L(n) по...

Разработать программу, которая строит логический вектор по заданному правилу
Заданная матрица x (n, n), n &lt;= 15. Разработать программу, которая строит логический вектор L (n) по правилу: L (i) = true, если в i-той...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru