C++ madLineCleaner

 

Представляю вам еще один продукт моего незамутненного светлого гения. Суть программы в том, чтобы убирать лишние пустые строки. Терпеть не могу пропуски строк в коде и вот, эта замечательная утилита решает данную проблему. 

🧹 madLineCleaner — удаление пустых строк

...из вашего несчастного говнокода.

madlineCleaner.exe — это небольшая утилита для Windows, написанная на C++, которая сканирует текущую директорию и удаляет все пустые строки из файлов с расширениями .txt и .cpp.

🔧 Что делает программа?

  • 📁 Ищет все .txt и .cpp файлы в текущей папке
  • 🔢 Показывает пронумерованный список найденных файлов — просто выбираешь нужную цифру и жмёшь Enter
  • 🧠 Удаляет строки, содержащие только пробелы или табуляции
  • 💾 Сохраняет результат в новый файл cleaned_ИМЯ_ФАЙЛА
  • 🖱️ Поддерживает запуск двойным кликом в Windows (через cmd)

💻 Как скомпилировать

Если используешь MinGW (g++ для Windows), обязательно собирай со статической линковкой:

g++ -static -std=c++17 -o madWinLineCleaner madWinLineCleaner.cpp

Это создаёт полностью автономный файл .exe, который не требует внешних DLL.

⚠️ Важно!

Если ты забудешь флаг -static, то при запуске может появиться ошибка:

❌ Не удается продолжить выполнение кода, так как не найдена libstdc++-6.dll

В этом случае либо пересобери программу с -static, либо положи нужные DLL (например, libstdc++-6.dll) рядом с .exe.

🚀 Как пользоваться

  1. Скомпилируй утилиту
  2. Положи madlineCleaner.exe в нужную папку с файлами
  3. Запусти двойным кликом
  4. Выбери нужный файл по номеру
  5. Готово — очищенный файл будет создан рядом

🪟 madWinLineCleaner — версия для Windows

// File: madWinLineCleaner.cpp
// Description: Удаляет все пустые строки из .txt и .cpp файлов в текущей директории.
// Compilation (Windows, g++):
// g++ -static -std=c++17 -o madWinLineCleaner madWinLineCleaner.cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <filesystem>
#include <string>
#include <algorithm>
#include <cctype>
namespace fs = std::filesystem;
// Функция для получения списка файлов с нужными расширениями
std::vector<fs::path> getTargetFiles() {
std::vector<fs::path> files;
for (const auto& entry : fs::directory_iterator(".")) {
if (entry.is_regular_file()) {
std::string extension = entry.path().extension().string();
std::transform(extension.begin(), extension.end(), extension.begin(),
[](unsigned char c){ return std::tolower(c); });
if (extension == ".txt" || extension == ".cpp") {
files.push_back(entry.path());
}
}
}
return files;
}
// Функция для удаления всех пустых строк из файла
void removeEmptyLines(const fs::path& filepath) {
std::ifstream inputFile(filepath);
if (!inputFile.is_open()) {
std::cerr << "Error: Cannot open file " << filepath << " for reading." << std::endl;
return;
}
fs::path outputPath = "cleaned_" + filepath.filename().string();
std::ofstream outputFile(outputPath);
if (!outputFile.is_open()) {
std::cerr << "Error: Cannot create file " << outputPath << " for writing." << std::endl;
inputFile.close();
return;
}
std::string line;
size_t removedCount = 0;
while (std::getline(inputFile, line)) {
bool isEmpty = true;
for (char c : line) {
if (!std::isspace(static_cast<unsigned char>(c))) {
isEmpty = false;
break;
}
}
if (!isEmpty) {
outputFile << line << "\n";
} else {
removedCount++;
}
}
inputFile.close();
outputFile.close();
std::cout << "✅ Done! Removed " << removedCount << " empty lines." << std::endl;
std::cout << "💾Result saved to: " << outputPath << std::endl;
}
int main() {
std::cout << "=== File Cleaner - Remove ALL Empty Lines ===" << std::endl;
std::cout << "Looking for .txt and .cpp files in current directory..." << std::endl;
std::vector<fs::path> files = getTargetFiles();
if (files.empty()) {
std::cout << "No .txt or .cpp files found in current directory." << std::endl;
std::cout << "\nPress Enter to exit...";
std::cin.ignore();
std::cin.get();
return 0;
}
std::cout << "\nFound files:" << std::endl;
for (size_t i = 0; i < files.size(); i++) {
std::cout << i + 1 << ". " << files[i].filename() << std::endl;
}
std::cout << "\nEnter file number to process (0 to exit): ";
int choice;
std::cin >> choice;
if (choice == 0) {
std::cout << "Exit." << std::endl;
std::cout << "\nPress Enter to exit...";
std::cin.ignore();
std::cin.get();
return 0; } if (choice < 1 || choice > static_cast<int>(files.size())) { std::cerr << "Error: Invalid choice." << std::endl; std::cout << "\nPress Enter to exit..."; std::cin.ignore(); std::cin.get(); return 1; } fs::path selectedFile = files[choice - 1]; std::cout << "Processing file: " << selectedFile.filename() << std::endl; removeEmptyLines(selectedFile); std::cout << "\nPress Enter to exit..."; std::cin.ignore(); std::cin.get(); return 0; }

🐧 madlineCleaner — версия для Linux

// madLinuxLineCleaner.cpp
// Описание: Удаляет все пустые строки из .txt и .cpp файлов в текущей директории (Linux-версия)
// Сайт: https://madmentat.ru
// Компиляция (Linux, g++): 
// g++ -static -std=c++17 -o madLinuxLineCleaner madLinuxLineCleaner.cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <filesystem>
#include <string>
#include <algorithm>
#include <cctype>
namespace fs = std::filesystem;
// Получение списка .txt и .cpp файлов
std::vector<fs::path> getTargetFiles() {
    std::vector<fs::path> files;
    for (const auto& entry : fs::directory_iterator(".")) {
        if (entry.is_regular_file()) {
            std::string extension = entry.path().extension().string();
            std::transform(extension.begin(), extension.end(), extension.begin(),
                           [](unsigned char c){ return std::tolower(c); });
            if (extension == ".txt" || extension == ".cpp") {
                files.push_back(entry.path());
            }
        }
    }
    return files;
}
// Удаление пустых строк
void removeEmptyLines(const fs::path& filepath) {
    std::ifstream inputFile(filepath);
    if (!inputFile.is_open()) {
        std::cerr << "Ошибка: не удалось открыть файл " << filepath << " для чтения.\n";
        return;
    }
    fs::path outputPath = "cleaned_" + filepath.filename().string();
    std::ofstream outputFile(outputPath);
    if (!outputFile.is_open()) {
        std::cerr << "Ошибка: не удалось создать файл " << outputPath << " для записи.\n";
        inputFile.close();
        return;
    }
    std::string line;
    size_t removedCount = 0;
    while (std::getline(inputFile, line)) {
        bool isEmpty = true;
        for (char c : line) {
            if (!std::isspace(static_cast<unsigned char>(c))) {
                isEmpty = false;
                break;
            }
        }
        if (!isEmpty) {
            outputFile << line << '\n';
        } else {
            removedCount++;
        }
    }
    inputFile.close();
    outputFile.close();
    std::cout << "✅ Готово! Удалено пустых строк: " << removedCount << "\n";
    std::cout << "💾 Результат сохранён в файл: " << outputPath << "\n";
}
int main() {
    std::cout << "🧹 madlineCleaner (Linux)\n";
    std::cout << "Ищем .txt и .cpp файлы в текущей директории...\n";
    std::vector<fs::path> files = getTargetFiles();
    if (files.empty()) {
        std::cout << "❗ Файлы с расширением .txt и .cpp не найдены.\n";
        return 0;
    }
    std::cout << "\nНайденные файлы:\n";
    for (size_t i = 0; i < files.size(); ++i) {
        std::cout << "  " << (i + 1) << ". " << files[i].filename() << '\n';
    }
    std::cout << "\nВведите номер файла для обработки (0 — выход): ";
    int choice;
    std::cin >> choice;
    if (choice == 0) {
        std::cout << "Выход.\n";
        return 0;
    }
    if (choice < 1 || choice > static_cast<int>(files.size())) {
        std::cerr << "❌ Ошибка: неверный выбор.\n";
        return 1;
    }
    fs::path selectedFile = files[choice - 1];
    std::cout << "📄 Обрабатываем файл: " << selectedFile.filename() << "\n";
    removeEmptyLines(selectedFile);
    return 0;
}

Автор: madmentat — минимализм побеждает пустоту 🦾