HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!
öncelikle cmd penceresini açıyoruz
pip install chardet
yazıp enter tusuna basıyoruz
1.h ve 2.h dosyaları olarak çalışıyor 2.h kendi service.h dosyamız 1.h diğer service.h dosyamız çıktı oluşturuyor zaten uzun uzun anlatmaya gerek yok.
Python:
import re
import chardet
import argparse
def detect_encoding(file_path):
"""
Dosyanın bayt modunda içeriğini okuyarak kodlamasını tespit eder.
"""
with open(file_path, 'rb') as f:
rawdata = f.read()
result = chardet.detect(rawdata)
encoding = result['encoding']
print(f"'{file_path}' dosyasının kodlaması: {encoding}")
return encoding
def dosya_okuma(dosya_adi):
"""
Belirtilen dosyayı okuyup, içerisindeki '#define' komutlarını
ve tanımlanan makro isimlerini liste olarak döndürür.
Yorum satırları (// ile başlayan kısımlar) dikkate alınmaz.
"""
defineler = []
try:
encoding = detect_encoding(dosya_adi)
# Hatalı karakterleri 'replace' ile değiştirme seçeneği eklenmiştir.
with open(dosya_adi, 'r', encoding=encoding, errors='replace') as file:
for satir in file:
# Satırdaki '//' ile başlayan kısmı yorum olarak kabul edip atıyoruz.
satir_no_comment = satir.split('//')[0]
# Düzenli ifade: satır başında boşluklar, '#define' ve ardından makro adı (sadece harf, rakam, alt çizgi)
match = re.match(r'^\s*#define\s+(\w+)', satir_no_comment)
if match:
defineler.append(match.group(1))
except FileNotFoundError:
print(f"Dosya bulunamadı: {dosya_adi}")
except UnicodeDecodeError as e:
print(f"Dosya '{dosya_adi}' okunurken bir karakter hatası oluştu: {e}")
return defineler
def eksik_defineler(dosya1, dosya2):
"""
İlk dosyada yer alan, fakat ikinci dosyada bulunmayan #define ifadelerini döndürür.
"""
dosya1_defineler = dosya_okuma(dosya1)
dosya2_defineler = dosya_okuma(dosya2)
# İkinci dosyadaki makro isimlerini hızlı arama için kümeye çeviriyoruz.
dosya2_set = set(dosya2_defineler)
# İlk dosyadaki, ikinci dosyada bulunmayan makro isimlerini seçiyoruz.
eksikler = [define for define in dosya1_defineler if define not in dosya2_set]
# Eğer aynı makro birden fazla tanımlanmışsa tekrarı önlemek için:
eksikler = list(dict.fromkeys(eksikler))
return eksikler
def parse_arguments():
"""
Komut satırı argümanlarını ayrıştırır.
--file1 : Birinci dosya adı (varsayılan: 1.h)
--file2 : İkinci dosya adı (varsayılan: 2.h)
--output: Çıktı dosyasının adı (varsayılan: eksik_defineler.txt)
"""
parser = argparse.ArgumentParser(
description="İki dosya arasında #define ifadelerini karşılaştırarak eksikleri bulur."
)
parser.add_argument("--file1", type=str, default="1.h",
help="Birinci dosya adı (default: 1.h)")
parser.add_argument("--file2", type=str, default="2.h",
help="İkinci dosya adı (default: 2.h)")
parser.add_argument("--output", type=str, default="eksik_defineler.txt",
help="Çıktı dosyasının adı (default: eksik_defineler.txt)")
return parser.parse_args()
def main():
args = parse_arguments()
dosya1 = args.file1
dosya2 = args.file2
output_file = args.output
eksik_listesi = eksik_defineler(dosya1, dosya2)
# Sonuçları çıktı dosyasına yazıyoruz.
try:
with open(output_file, 'w', encoding='utf-8') as f:
if eksik_listesi:
f.write("Birinci dosyada olup ikinci dosyada olmayan defineler:\n")
for define in eksik_listesi:
f.write(define + "\n")
else:
f.write("Birinci dosyada olup ikinci dosyada olmayan bir define bulunmuyor.\n")
print(f"Sonuçlar '{output_file}' dosyasına yazıldı.")
except Exception as e:
print(f"Çıktı dosyası yazılırken hata oluştu: {e}")
if __name__ == "__main__":
main()
