parallel-programming/3/openmp/linux/zadanie3.cpp

73 lines
2.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <iostream>
#include <fstream>
#include <vector>
#include <omp.h>
#include <sstream>
#include <locale>
using namespace std;
// Функция для подчёта статистики о файле
void count_stats(const string& filename, int& line_count, int& word_count, int& char_count) {
ifstream file(filename);
if (!file.is_open()) {
cerr << "Ошибка открытия файла: " << filename << endl;
return;
}
string line;
while (getline(file, line)) {
//конструкция atomic гарантирует атомарный доступ к определенному месту хранения, а не подвергает его возможности одновременного чтения и записи нескольких потоков,
// что может привести к неопределенным значениям. Другими словами, операция выполняется целиком, без возможности прерывания другими потоками.
#pragma omp atomic
++line_count;
char_count += line.size();
// Подсчет слов
bool in_word = false;
for (char c : line) {
if (isspace(c)) {
in_word = false;
}
else if (!in_word) {
in_word = true;
#pragma omp atomic
++word_count;
}
}
}
file.close();
}
int main() {
setlocale(LC_ALL, "Russian");
const string directory_path = "C:\\Users\\ilyas\\Desktop\\500f"; // Замените на путь к вашему каталогу
#pragma omp parallel for
for (int i = 0; i <= 500; ++i) {// Обработка файлов с именами 1.txt, 2.txt, ..., 10.txt. Нужно задать число, о скольких файлах мы хотим видеть стату
string filename = directory_path + "\\" + to_string(i) + ".txt";
int line_count = 0;
int word_count = 0;
int char_count = 0;
count_stats(filename, line_count, word_count, char_count);
// Вывод результатов
#pragma omp critical
{
cout << "Статистика для файла " << filename << ":" << endl
<< " Количество строк: " << line_count << endl
<< " Количество слов: " << word_count << endl
<< " Количество символов: " << char_count << endl
<< "-------------------------" << endl;
}
}
return 0;
}