Merhaba arkadaşlar.C den proje aldım.Şöyle;programabir dizin altındaki tüm klasörleri tarayacak(mesela C:/users gibi) ve uzantısı txt olanları bulacak . txt içindeki kelimeleri değiştirme seçeneği de olacak yardımlarınızı bekliyorum.
C Programlama Proje
Cevaplar
Hem de c ile. Hiç uğraşılmaz :D Ben sırf lazım oldu diye c# ile benzer bir şeyi yapmıştım. Nette hiç aradın mı örnek kod falan?
Aklıma bir yöntem geldi. Eğer windows üzerinde çalışıyorsa,
DOS üzerinden arattır. Parametrelerini hatırlamıyorum ama "dir" komutu listeliyor.
dir *.txt > C:\temp.txt
komutunu verirsin.Böylece temp.txt ye kaydolmuş olur ordan da okursun, aslında konsol çıktısını direkt olarak okuma vardı da şimdi hatırlamıyorum, çok meşekkatli bir yoldu. Böylesi daha kolay sanki. İçeriği okuduktan sonra da temp.txt ni silersin.
Şimdilik aklıma gelen yol bu. Başka bir yol gelirse söylerim.
DOS üzerinden arattır. Parametrelerini hatırlamıyorum ama "dir" komutu listeliyor.
dir *.txt > C:\temp.txt
komutunu verirsin.Böylece temp.txt ye kaydolmuş olur ordan da okursun, aslında konsol çıktısını direkt olarak okuma vardı da şimdi hatırlamıyorum, çok meşekkatli bir yoldu. Böylesi daha kolay sanki. İçeriği okuduktan sonra da temp.txt ni silersin.
Şimdilik aklıma gelen yol bu. Başka bir yol gelirse söylerim.
tşk
bunu zaten yapabilen çok gelişmiş bir komut satırı programı zaten var http://stahlworks.com/dev/index.php?tool=rep
replace anahtarının parametrelerini inceleyip kendine uygun bir sonuç oluşturabilirsin
replace anahtarının parametrelerini inceleyip kendine uygun bir sonuç oluşturabilirsin
kocaeli bilgisar mühendisliğinin ödevi bu arkadaşım da yapamadı bi türlü zaten okulda bi nane öğretmiyolar diye dert yanıodu bilen varsa yardımı bende bekliyorum
yanlış hatırlamıyorsam system() fonksiyonu ile bu işi tek satırda çözmeniz mümkün. Tabi ki I/O files okumayı bildiğinizi varsayıyorum.DOS un dir komutu /b parametresi ile çalıştırırsanız o saçma şeylerden de kurtulursunuz. şöyle ki:
system("dir /b *.txt > C:\\tmp.txt");
satırıyla tahminimce direkt olarak txt ye aktarılmış olur ordan da okursunuz.
Bu ödevin çözümü muhtemelen windows.h tan geçer. Yerinizde olsam msdn den bakardım. Hadi linki de ben vereyim :)
http://msdn.microsoft.com/en-us/library/ms682073%28v=VS.85%29.aspx
dir komutuna fazla seçenek eklemek isterseniz konsola:
dir /? yazarak parametreleri öğrenmeniz mümkün. Bunu da halledince heralde fazla da bir şey kalmıyor ödevde. :)
system("dir /b *.txt > C:\\tmp.txt");
satırıyla tahminimce direkt olarak txt ye aktarılmış olur ordan da okursunuz.
Bu ödevin çözümü muhtemelen windows.h tan geçer. Yerinizde olsam msdn den bakardım. Hadi linki de ben vereyim :)
http://msdn.microsoft.com/en-us/library/ms682073%28v=VS.85%29.aspx
dir komutuna fazla seçenek eklemek isterseniz konsola:
dir /? yazarak parametreleri öğrenmeniz mümkün. Bunu da halledince heralde fazla da bir şey kalmıyor ödevde. :)
Düzeltme: Allah Allah bu windows.h ben borland c++ kullanırken bende yoktu, çok sıkıntısını çekmiştim. Vardı da benmi bilmiyordum ilginç.
Zamanında baya C, C++ kasmıştım ama uzun zaman oldu. Elimde ne derleyici var ne de editör.
Ki olsa bile yine yardım etmezdim, internette böyle ödev için forumları aşındıran çok kişi var. Öğrencilerin yapması gereken şeyleri başkalarının yapmasını doğru bulmuyorum.
Bu benim düşüncem beni bağlar, yardım etmek isteyen yardımını yine esirgemesin.
Zamanında baya C, C++ kasmıştım ama uzun zaman oldu. Elimde ne derleyici var ne de editör.
Ki olsa bile yine yardım etmezdim, internette böyle ödev için forumları aşındıran çok kişi var. Öğrencilerin yapması gereken şeyleri başkalarının yapmasını doğru bulmuyorum.
Bu benim düşüncem beni bağlar, yardım etmek isteyen yardımını yine esirgemesin.
koü bilgisayar müh. prolab 1 projesi bu sen de bizden misin
tamam da c# a özgü değil ki. Biz de zamanında kullandık C de windows.h kütüphanesini:) Dilersen deneyebilirsin. Gayet güzel çalışıyor kütüphane. Yardım etmem de sadece zor yerini gösterdim, herkes msdos komutlarını veyahut windows.h kütüphanesini ezbere bilmek zorunda değil. Bence ödevin kendisi yazılmadığı takdirde böyle yardımların hiçbir sakıncası yok. :)
Bu da benim şahsi görüşüm:)
Bu da benim şahsi görüşüm:)
Dediğim gibi bu benim görüşüm. Kimsenin katılmasını beklemiyorum.
Windows.h kütüphanesine de baktım haklısın, ama ben borland c++ ile kafayı yerken bunu nasıl görmedim hayret. Ya benim kullandığım sürümde yoktu ya da gözümden kaçtı, dediğim gibi nerden baksan 10 yıldan fazla oldu.
Windows.h kütüphanesine de baktım haklısın, ama ben borland c++ ile kafayı yerken bunu nasıl görmedim hayret. Ya benim kullandığım sürümde yoktu ya da gözümden kaçtı, dediğim gibi nerden baksan 10 yıldan fazla oldu.
programın tamamını yazmanızı tabi ki istemiyorum. ama bazı noktalarda yardım almak gerekir.bu bilgiler faydalı oldu teşekkür ederim
#include <windows.h>
#include <string.h>
void DirScanStub()
{
const char dirName[] = "c:\\temp\\";
const char dirScan[] = "c:\\temp\\*.*";
char* pname = 0; /* Dosya adı */
WIN32_FIND_DATA info;
HANDLE h = FindFirstFile(dirScan,&info);
if (h == INVALID_HANDLE_VALUE)
{
/* mesaj?.. */
return;
}
pname = (char*)malloc(MAX_PATH); /* (char*) sadece C++ için */
do
{
if ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
continue; /* dizinleri atla */
strcat(strcpy(pname,dirName),info.cFileName);
/* Bir sonraki dosya ismi cepte... */
/* Aç- işlem yap - kapat ...*/
} while (FindNextFile(h,&info));
FindClose(h); /* Dizin taramayı kapat */
free(pname);
}
WIN32_FIND_DATA kısmından da anlaşılacağı gibi sadece WIN32. Bir yerden başlamk için yardımcı olur sanırımTamda helal olsun diyecektim ki fonksiyon isminden bir yerlerden alıntı yapıldığı belli oluyor. http://www.daniweb.com/forums/thread143279.html
WIN32_FIND_DATA FindFirstFile, FindFirstFileEx, or FindNextFile fonksiyonlarından biri çağrıldığında ilgili dosyanın
DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[MAX_PATH]; TCHAR cAlternateFileName[14];
bilgilerini tutan bir nesne
WIN32_FIND_DATA info; diyerek info adında yeni bir WIN32_FIND_DATA nesnesi oluşturuyorsun
Örnek çok güzelmiş, prof birine ait olduğu kesin
#include <windows.h>
#include <string.h>
void DirScanStub()
{
const char dirName[] = "c:\\temp\\";
const char dirScan[] = "c:\\temp\\*.*";
char* pname = 0; /* File name buffer */
WIN32_FIND_DATA info;
HANDLE h = FindFirstFile(dirScan,&info);
if (h == INVALID_HANDLE_VALUE)
{
/* print message?.. */ Eğer dizindeki ilk dosya okuma sırasında bir hata oluşmuşsa hata mesajı buraya
return;
}
pname = (char*)malloc(MAX_PATH); /* (char*) for C++ only */
do
{
if ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) info nesnesinin bilgilerini aldığı dosya bir dizinmi onu kontrol ediyor
continue; /* skip directories */ Eğer dizin ise atlıyor
strcat(strcpy(pname,dirName),info.cFileName); dizin+dosya adı şeklinde dosyanın path'ini çıkartıyor ama parametre kısmında srtcat çıktısı hangi değişkene gidiyor bak orasını bende anlamadım :)
/* Now we have the next file name... */ Buradan sonrası sana kalmış demek istiyor, artık dosya yolu + ismine sahipsin
/* Open, process then close the file ...*/ ihtiyacın olan dosya içinde arama ve değiştirme işlemini yap ve dosyayı kapat
} while (FindNextFile(h,&info));
FindClose(h); /* Close dir scan */
free(pname);
}
WIN32_FIND_DATA FindFirstFile, FindFirstFileEx, or FindNextFile fonksiyonlarından biri çağrıldığında ilgili dosyanın
DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[MAX_PATH]; TCHAR cAlternateFileName[14];
bilgilerini tutan bir nesne
WIN32_FIND_DATA info; diyerek info adında yeni bir WIN32_FIND_DATA nesnesi oluşturuyorsun
Örnek çok güzelmiş, prof birine ait olduğu kesin
#include <windows.h>
#include <string.h>
void DirScanStub()
{
const char dirName[] = "c:\\temp\\";
const char dirScan[] = "c:\\temp\\*.*";
char* pname = 0; /* File name buffer */
WIN32_FIND_DATA info;
HANDLE h = FindFirstFile(dirScan,&info);
if (h == INVALID_HANDLE_VALUE)
{
/* print message?.. */ Eğer dizindeki ilk dosya okuma sırasında bir hata oluşmuşsa hata mesajı buraya
return;
}
pname = (char*)malloc(MAX_PATH); /* (char*) for C++ only */
do
{
if ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) info nesnesinin bilgilerini aldığı dosya bir dizinmi onu kontrol ediyor
continue; /* skip directories */ Eğer dizin ise atlıyor
strcat(strcpy(pname,dirName),info.cFileName); dizin+dosya adı şeklinde dosyanın path'ini çıkartıyor ama parametre kısmında srtcat çıktısı hangi değişkene gidiyor bak orasını bende anlamadım :)
/* Now we have the next file name... */ Buradan sonrası sana kalmış demek istiyor, artık dosya yolu + ismine sahipsin
/* Open, process then close the file ...*/ ihtiyacın olan dosya içinde arama ve değiştirme işlemini yap ve dosyayı kapat
} while (FindNextFile(h,&info));
FindClose(h); /* Close dir scan */
free(pname);
}
güzel bir örnek
Valla çok isterdim ama C bilmiyorum. Ben sadece yardımcı olmak için google dan bi tarama yaptırdım o kadar :)
Bi de
strcat(strcpy(pname,dirName),info.cFileName);
kısmında hangi değişkene gidiyor anlamadım demişsin. Sanırım şöyle
(strcpy için)
Hedef Kaynak
-------------------------------------------
pname dirName
(strcat için)
Hedef Kaynak
-------------------------------------------
pname info.cFileName
yani dizin ve dosya adı pname'e gidiyor. Dosya ve dizin adını bu şekilde birleştirmiş. Ya da sallıyorum :)
Bi de
strcat(strcpy(pname,dirName),info.cFileName);
kısmında hangi değişkene gidiyor anlamadım demişsin. Sanırım şöyle
(strcpy için)
Hedef Kaynak
-------------------------------------------
pname dirName
(strcat için)
Hedef Kaynak
-------------------------------------------
pname info.cFileName
yani dizin ve dosya adı pname'e gidiyor. Dosya ve dizin adını bu şekilde birleştirmiş. Ya da sallıyorum :)
Hacı strcpy fonksiyonu srtcat'in parametre bloğunda. strcpy fonksiyonu return değeri olarak çıktıyı gönderiyor, yani çıktı değerinden pname değişkenine müdaahele edemez. Aklıma gelen tek bir ihtimal C'nin üstünlüklerinden olan pointer kullanımı. strcpy fonksiyonu strcat fonksiyonuna pname değişkenin pointer'ini (bellek adresini) gönderiyorsa o zaman olabilir.mgsmus dedi: ↑Valla çok isterdim ama C bilmiyorum. Ben sadece yardımcı olmak için google dan bi tarama yaptırdım o kadar :)
Bi de
strcat(strcpy(pname,dirName),info.cFileName);
kısmında hangi değişkene gidiyor anlamadım demişsin. Sanırım şöyle
(strcpy için)
Hedef Kaynak
-------------------------------------------
pname dirName
(strcat için)
Hedef Kaynak
-------------------------------------------
pname info.cFileName
yani dizin ve dosya adı pname'e gidiyor. Dosya ve dizin adını bu şekilde birleştirmiş. Ya da sallıyorum :)
Fakat strcpy fonksiyonu için dönüş değeri
Return Value
destination is returned.
diyor yani pointer değil değerin kendisi dönüyor.
Bir usta açıklarsa iyi olur :)
pname = (char*)malloc(MAX_PATH); kısmında pname için bellek ayrılmış, tüm dosya yolunu dosya adıyla alacak kadar (maksimum 260 karakter). Byte cinsinden. Strcpy ve strcat dosya yolunu dosya adıyla birlikte(yani return value) ayrılmış belleğe yazıyor.
system("dir/b/s *.txt > C:\\temp.txt"); komutuyla txt dosyalarının adreslerini ve isimlerini temp.txt nin içine attım.bu aşamada bu txt dosyalarında nasıl işlem yapıcam.içlerinde kelime arayacağım örneğin.ama elimde dosyaların kendisi değil isimleri ve adresleri var.yardım eder misiniz..
bu yöntemi ben denedim 1 yerde patlıyor haberin olsuncnak dedi: ↑system("dir/b/s *.txt > C:\\temp.txt"); komutuyla txt dosyalarının adreslerini ve isimlerini temp.txt nin içine attım.bu aşamada bu txt dosyalarında nasıl işlem yapıcam.içlerinde kelime arayacağım örneğin.ama elimde dosyaların kendisi değil isimleri ve adresleri var.yardım eder misiniz..
İster WIN32_FIND_DATA yönetimini kullanın ister system("dir/b/s *.txt > C:\\temp.txt"); yönetimini kullanın her şekilde bir döngü yapıp, tek tek dosyaların içerisinde arama yaptırmanız lazım.
system yöntemini kullanıp temp.txt dosyasına dosya isimlerini yazdırmışsınız. Demek ki temp.txt dosyası tekrar açılacak içerisinden dosya adları alınıp bir diziye aktarılacak. daha sonra dizi elemanları döngüye sokulup içinde arama yapılacak. diziyi iki üç boyutlu tutup ya da obje olarak kullanıp dosya adı-bulundu/bulunmadı-satır şeklinde tutacak.
Dosya adlarını oku
Diziye aktar
Aranacak kelimeyi belirle
Sonuç dizisi oluştur
Foreach
Bulundu ise sonuç dizisine dosya adını,satırı, kaç kez geçtiğini vs... yaz
Döngüyü bitir
Sonuç dizisini yazdır
gibi
ifstream konusunu inceleyin.
system yöntemini kullanıp temp.txt dosyasına dosya isimlerini yazdırmışsınız. Demek ki temp.txt dosyası tekrar açılacak içerisinden dosya adları alınıp bir diziye aktarılacak. daha sonra dizi elemanları döngüye sokulup içinde arama yapılacak. diziyi iki üç boyutlu tutup ya da obje olarak kullanıp dosya adı-bulundu/bulunmadı-satır şeklinde tutacak.
Dosya adlarını oku
Diziye aktar
Aranacak kelimeyi belirle
Sonuç dizisi oluştur
Foreach
Bulundu ise sonuç dizisine dosya adını,satırı, kaç kez geçtiğini vs... yaz
Döngüyü bitir
Sonuç dizisini yazdır
gibi
ifstream konusunu inceleyin.