Перевести с С++ на чистый С - C (СИ)
Формулировка задачи:
Дан текстовый файл. Создать символьный файл, содержащий все символы, встретившиеся в тексте, включая пробел и знаки препинания (без повторений). Символы располагать в порядке их первого появления в тексте.
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <fstream>
#include <set>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
fstream file;
file.open("d:\\in.txt", ios::in);
if (!file.is_open())
{
cerr << "Error open file" << '\n';
return EXIT_FAILURE;
}
vector<string> text;
string line;
while(getline(file, line))
{
text.push_back(line);
}
set<char> st;
for_each(text.begin(), text.end(), [&st](string s)
{
st.insert(s.begin(), s.end());
});
copy(st.begin(),st.end(), ostream_iterator<char> (cout, " "));
return EXIT_SUCCESS;
}Решение задачи: «Перевести с С++ на чистый С»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stddef.h>
int main(void)
{
const char* in_filename = "in.txt";
const char* out_filename = "out.txt";
FILE* in_file;
FILE* out_file;
char in_buf[256] = "";
char out_buf[256] = "";
size_t i, j;
in_file = fopen(in_filename, "r");
if(in_file == NULL)
{
fprintf(stderr, "Error!!! Can`t open file \"%s\"\n", in_filename);
return 1;
}
out_file = fopen(out_filename, "w");
if(out_file == NULL)
{
fprintf(stderr, "Error!!! Can`t open file \"%s\"\n", out_filename);
return 1;
}
//=========================
j = 0;
while(fgets(in_buf, sizeof(in_buf), in_file))
for(i = 0; in_buf[i] != '\0'; ++i)
if(strchr(out_buf, in_buf[i]) == NULL)
out_buf[j++] = in_buf[i];
fprintf(out_file, out_buf);
fclose(in_file);
fclose(out_file);
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdio.h, string.h, stddef.h
- Объявляется функция main, которая возвращает значение типа int и не принимает аргументов.
- Объявляются две константы строкового типа: in_filename и out_filename, которые содержат пути к входному и выходному файлам соответственно.
- Создаются два указателя на файлы: in_file и out_file, которые будут использоваться для чтения из входного файла и записи в выходной файл соответственно.
- Создается массив char типа in_buf, который будет использоваться для чтения данных из входного файла.
- Создается массив char типа out_buf, который будет использоваться для записи данных из входного файла в выходной файл.
- Объявляются две переменные типа size_t: i и j, которые будут использоваться для индексации символов в массивах in_buf и out_buf.
- Открывается входной файл с помощью функции fopen, и если открытие не удалось, выводится сообщение об ошибке и возвращается значение 1.
- Открывается выходной файл с помощью функции fopen, и если открытие не удалось, выводится сообщение об ошибке и возвращается значение 1.
- Начинается цикл while, который будет выполняться до тех пор, пока не будет достигнут конец строки во входном файле.
- Внутри цикла while начинается вложенный цикл for, который будет выполняться для каждого символа в текущей строке входного файла.
- Внутри вложенного цикла for проверяется, есть ли текущий символ в массиве out_buf. Если символа нет, он добавляется в массив out_buf.
- После окончания вложенного цикла for, символ новой строки добавляется в массив out_buf.
- Закрывается входной файл с помощью функции fclose.
- Закрывается выходной файл с помощью функции fclose.
- Возвращается значение 0, что означает успешное выполнение программы.