C++ TXT okuma ve int'e çevirme

alinin

Decapat
Katılım
25 Kasım 2018
Mesajlar
9
TXT'den okudugumuz verileri bir string dizisine atadık sonra bu string dizisinin elemanlarını bölüp int sayılar çıkarmaya calışıyoruz. Örnek txt: 12 24 36 48

Bosluklara kadar okunacak. C#'daki gibi split fonk var mı? İlla fonk mu yazmak lazım?
 
Son düzenleyen: Moderatör:
Çözüm
Aşağıdaki şekilde istediğin işlemi gerçekleştirebiliyoruz, split'e benzer fonksiyonlar da mevcut fakat senin isteğin doğrultusunda en basiti bu olacaktır. :)
C++:
#include <iostream>
#include <vector>
#include <fstream>

int main() {

    std::ifstream dosya;
    dosya.open("dosya.txt");    // Dosyamızın doğru yerde olduğundan emin olalım
    if (!dosya) {
        std::cout << "Dosya açılamadı";
        exit(1);
    }
    std::vector<int> sayilar(12); //Vector boyutu ayarlanabilir dizi demektir,
    // 12 parametresi ile dizimizin boyutunu (sizeof(int) * 12) belirtiyoruz,
    // yani dosyamızdan okuyacağımız ilk 12 int değerini vectorün boyutunu değiştirmeden
    // kullanabilmemize olanak sağlıyor, bu olay optimizasyon için tercih edilmelidir.

    char x[512]; // int yerine char yapmamın nedeni dosyamızda örneğin "12s4" sayısı
    //     olsun int değer kullansaydık while döngümüz 12'ye kadar olan kısmı okuyup
    //   işlemin bitmesine neden olacaktı.
    while (dosya >> x){
        sayilar.push_back(atoi(x)); // atoi fonksiyonu sayesinde char türünde gelen
        // verimizin içindeki sayıları çekebiliyoruz, push_back fonksiyonumuzu
        // kullanarak da vektörümüzün sonuna elde ettiğimiz int değeri yazıyoruz.
    }
}
Konuyu daha iyi açıklayabilmek adına kendi "split" fonksiyonumuzu yazdım satır satır açıklamalar mevcut.
C++:
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <algorithm>

void ayraç(const std::string& yazi, std::vector<std::string>& liste, char ayırıcı)
{
    size_t pozisyon = yazi.find(ayırıcı); // Ayırıcı olarak kullanacağımız boşluk karakterinin
    //  ilk bulunduğu yeri vericek.

    size_t pozBaslangic = 0; // Yazımızı incelemeye başlayacağımız nokta, şuan 0 çünkü en başından
    // itibaren incelemek istiyoruz.

    while (pozisyon != std::string::npos) // Ayracımız dosyanın sonuna gelmemişse
    // yani boşluk karakteri başarılı şekilde bulunduysa
    {
        liste.push_back(yazi.substr(pozBaslangic, pozisyon - pozBaslangic));
        //substr ile başlangıç pozisyonundan boşluk karakteri arasındaki yaziyi buluyoruz
        //ve listemize eklemesi için push_back komutunu çağırıyoruz.
        pozBaslangic = pozisyon + 1; // pozisyonu bir arttırıyoruz çünkü bulduğumuz kelimelerde
        //boşluk karakterinin gözükmesini istemiyoruz.
        pozisyon = yazi.find(ayırıcı, pozBaslangic); // bir sonraki boşluk karakterini buluyoruz.
        //eğer uygun bir karakter bulunursa döngü kaldığı yerden devam edecek.
    }
    liste.push_back((yazi.substr(pozBaslangic, std::min(pozisyon, yazi.size()) - pozBaslangic + 1)));
    //while döngüsünden çıktığımıza göre başka boşluk karakteri bulamadık demektir, en son bulduğumuz
    //karakterden sonrasını alarak en son kelimemizi de bulmuş oluyoruz ve listemize ekliyoruz.
}

int main()
{
    std::ifstream dosyamiz;
    dosyamiz.open("dosya.txt"); // Dosyamızı açıyoruz
    std::string yazininTamamı; //Çok satırlı bir dosyamız olabileceğini varsayarak bu programı
    // yazdım burdaki amaç dosyamızdaki tüm satırları tek tek okuyarak okuduğumuz verilerin tamamını
    // tek bir değişken içerisine yazmak bu sayede kolaylıkla dosyamızı inceleyebiliriz.
    std::string satır; //Satırları tek tek alırken kullanıcaz.
    while (std::getline(dosyamiz,satır)) //Dosyamızdaki satırları sıra sıra okuyoruz ve satır
    // değişkenimize yazıyoruz.
    {
        yazininTamamı.append(satır+' '); //Her satır sonrası boşluk karakteri ekliyoruz ki
        //programımız yeni satırı yeni kelime olarak algılayabilsin.
    }
   
    std::vector<std::string> liste; //Ayırdığımız kelimeleri tutacak olan dinamik dizimiz.
    ayraç(yazininTamamı, liste, ' '); //Ayraç fonksiyonumuzu çağırıyoruz parametreler şu şekilde;
    // incelenecek yazı, ayrılan kelimelerin yazılacağı dinamik dizi, ayırmak için kullanılan karakter
   
    for (int i = 0; i < liste.size() - 1 ; i++) {
        std::cout << "Liste[" << i << "]: " << liste[i] << std::endl;
    }

}
Aşağıdaki şekilde istediğin işlemi gerçekleştirebiliyoruz, split'e benzer fonksiyonlar da mevcut fakat senin isteğin doğrultusunda en basiti bu olacaktır. :)
C++:
#include <iostream>
#include <vector>
#include <fstream>

int main() {

    std::ifstream dosya;
    dosya.open("dosya.txt");    // Dosyamızın doğru yerde olduğundan emin olalım
    if (!dosya) {
        std::cout << "Dosya açılamadı";
        exit(1);
    }
    std::vector<int> sayilar(12); //Vector boyutu ayarlanabilir dizi demektir,
    // 12 parametresi ile dizimizin boyutunu (sizeof(int) * 12) belirtiyoruz,
    // yani dosyamızdan okuyacağımız ilk 12 int değerini vectorün boyutunu değiştirmeden
    // kullanabilmemize olanak sağlıyor, bu olay optimizasyon için tercih edilmelidir.

    char x[512]; // int yerine char yapmamın nedeni dosyamızda örneğin "12s4" sayısı
    //     olsun int değer kullansaydık while döngümüz 12'ye kadar olan kısmı okuyup
    //   işlemin bitmesine neden olacaktı.
    while (dosya >> x){
        sayilar.push_back(atoi(x)); // atoi fonksiyonu sayesinde char türünde gelen
        // verimizin içindeki sayıları çekebiliyoruz, push_back fonksiyonumuzu
        // kullanarak da vektörümüzün sonuna elde ettiğimiz int değeri yazıyoruz.
    }
}
Konuyu daha iyi açıklayabilmek adına kendi "split" fonksiyonumuzu yazdım satır satır açıklamalar mevcut.
C++:
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <algorithm>

void ayraç(const std::string& yazi, std::vector<std::string>& liste, char ayırıcı)
{
    size_t pozisyon = yazi.find(ayırıcı); // Ayırıcı olarak kullanacağımız boşluk karakterinin
    //  ilk bulunduğu yeri vericek.

    size_t pozBaslangic = 0; // Yazımızı incelemeye başlayacağımız nokta, şuan 0 çünkü en başından
    // itibaren incelemek istiyoruz.

    while (pozisyon != std::string::npos) // Ayracımız dosyanın sonuna gelmemişse
    // yani boşluk karakteri başarılı şekilde bulunduysa
    {
        liste.push_back(yazi.substr(pozBaslangic, pozisyon - pozBaslangic));
        //substr ile başlangıç pozisyonundan boşluk karakteri arasındaki yaziyi buluyoruz
        //ve listemize eklemesi için push_back komutunu çağırıyoruz.
        pozBaslangic = pozisyon + 1; // pozisyonu bir arttırıyoruz çünkü bulduğumuz kelimelerde
        //boşluk karakterinin gözükmesini istemiyoruz.
        pozisyon = yazi.find(ayırıcı, pozBaslangic); // bir sonraki boşluk karakterini buluyoruz.
        //eğer uygun bir karakter bulunursa döngü kaldığı yerden devam edecek.
    }
    liste.push_back((yazi.substr(pozBaslangic, std::min(pozisyon, yazi.size()) - pozBaslangic + 1)));
    //while döngüsünden çıktığımıza göre başka boşluk karakteri bulamadık demektir, en son bulduğumuz
    //karakterden sonrasını alarak en son kelimemizi de bulmuş oluyoruz ve listemize ekliyoruz.
}

int main()
{
    std::ifstream dosyamiz;
    dosyamiz.open("dosya.txt"); // Dosyamızı açıyoruz
    std::string yazininTamamı; //Çok satırlı bir dosyamız olabileceğini varsayarak bu programı
    // yazdım burdaki amaç dosyamızdaki tüm satırları tek tek okuyarak okuduğumuz verilerin tamamını
    // tek bir değişken içerisine yazmak bu sayede kolaylıkla dosyamızı inceleyebiliriz.
    std::string satır; //Satırları tek tek alırken kullanıcaz.
    while (std::getline(dosyamiz,satır)) //Dosyamızdaki satırları sıra sıra okuyoruz ve satır
    // değişkenimize yazıyoruz.
    {
        yazininTamamı.append(satır+' '); //Her satır sonrası boşluk karakteri ekliyoruz ki
        //programımız yeni satırı yeni kelime olarak algılayabilsin.
    }
   
    std::vector<std::string> liste; //Ayırdığımız kelimeleri tutacak olan dinamik dizimiz.
    ayraç(yazininTamamı, liste, ' '); //Ayraç fonksiyonumuzu çağırıyoruz parametreler şu şekilde;
    // incelenecek yazı, ayrılan kelimelerin yazılacağı dinamik dizi, ayırmak için kullanılan karakter
   
    for (int i = 0; i < liste.size() - 1 ; i++) {
        std::cout << "Liste[" << i << "]: " << liste[i] << std::endl;
    }

}
 
Son düzenleyen: Moderatör:
Çözüm
Aşağıdaki şekilde istediğin işlemi gerçekleştirebiliyoruz, split'e benzer fonksiyonlar da mevcut fakat senin isteğin doğrultusunda en basiti bu olacaktır. :)
C++:
#include <iostream>
#include <vector>
#include <fstream>

int main() {

    std::ifstream dosya;
    dosya.open("dosya.txt");    // Dosyamızın doğru yerde olduğundan emin olalım
    if (!dosya) {
        std::cout << "Dosya açılamadı";
        exit(1);
    }
    std::vector<int> sayilar(12); //Vector boyutu ayarlanabilir dizi demektir,
    // 12 parametresi ile dizimizin boyutunu (sizeof(int) * 12) belirtiyoruz,
    // yani dosyamızdan okuyacağımız ilk 12 int değerini vectorün boyutunu değiştirmeden
    // kullanabilmemize olanak sağlıyor, bu olay optimizasyon için tercih edilmelidir.

    char x[512]; // int yerine char yapmamın nedeni dosyamızda örneğin "12s4" sayısı
    //     olsun int değer kullansaydık while döngümüz 12'ye kadar olan kısmı okuyup
    //   işlemin bitmesine neden olacaktı.
    while (dosya >> x){
        sayilar.push_back(atoi(x)); // atoi fonksiyonu sayesinde char türünde gelen
        // verimizin içindeki sayıları çekebiliyoruz, push_back fonksiyonumuzu
        // kullanarak da vektörümüzün sonuna elde ettiğimiz int değeri yazıyoruz.
    }
}
Konuyu daha iyi açıklayabilmek adına kendi "split" fonksiyonumuzu yazdım satır satır açıklamalar mevcut.
C++:
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <algorithm>

void ayraç(const std::string& yazi, std::vector<std::string>& liste, char ayırıcı)
{
    size_t pozisyon = yazi.find(ayırıcı); // Ayırıcı olarak kullanacağımız boşluk karakterinin
    //  ilk bulunduğu yeri vericek.

    size_t pozBaslangic = 0; // Yazımızı incelemeye başlayacağımız nokta, şuan 0 çünkü en başından
    // itibaren incelemek istiyoruz.

    while (pozisyon != std::string::npos) // Ayracımız dosyanın sonuna gelmemişse
    // yani boşluk karakteri başarılı şekilde bulunduysa
    {
        liste.push_back(yazi.substr(pozBaslangic, pozisyon - pozBaslangic));
        //substr ile başlangıç pozisyonundan boşluk karakteri arasındaki yaziyi buluyoruz
        //ve listemize eklemesi için push_back komutunu çağırıyoruz.
        pozBaslangic = pozisyon + 1; // pozisyonu bir arttırıyoruz çünkü bulduğumuz kelimelerde
        //boşluk karakterinin gözükmesini istemiyoruz.
        pozisyon = yazi.find(ayırıcı, pozBaslangic); // bir sonraki boşluk karakterini buluyoruz.
        //eğer uygun bir karakter bulunursa döngü kaldığı yerden devam edecek.
    }
    liste.push_back((yazi.substr(pozBaslangic, std::min(pozisyon, yazi.size()) - pozBaslangic + 1)));
    //while döngüsünden çıktığımıza göre başka boşluk karakteri bulamadık demektir, en son bulduğumuz
    //karakterden sonrasını alarak en son kelimemizi de bulmuş oluyoruz ve listemize ekliyoruz.
}

int main()
{
    std::ifstream dosyamiz;
    dosyamiz.open("dosya.txt"); // Dosyamızı açıyoruz
    std::string yazininTamamı; //Çok satırlı bir dosyamız olabileceğini varsayarak bu programı
    // yazdım burdaki amaç dosyamızdaki tüm satırları tek tek okuyarak okuduğumuz verilerin tamamını
    // tek bir değişken içerisine yazmak bu sayede kolaylıkla dosyamızı inceleyebiliriz.
    std::string satır; //Satırları tek tek alırken kullanıcaz.
    while (std::getline(dosyamiz,satır)) //Dosyamızdaki satırları sıra sıra okuyoruz ve satır
    // değişkenimize yazıyoruz.
    {
        yazininTamamı.append(satır+' '); //Her satır sonrası boşluk karakteri ekliyoruz ki
        //programımız yeni satırı yeni kelime olarak algılayabilsin.
    }
  
    std::vector<std::string> liste; //Ayırdığımız kelimeleri tutacak olan dinamik dizimiz.
    ayraç(yazininTamamı, liste, ' '); //Ayraç fonksiyonumuzu çağırıyoruz parametreler şu şekilde;
    // incelenecek yazı, ayrılan kelimelerin yazılacağı dinamik dizi, ayırmak için kullanılan karakter
  
    for (int i = 0; i < liste.size() - 1 ; i++) {
        std::cout << "Liste[" << i << "]: " << liste[i] << std::endl;
    }

}

Cevabınız için teşekkürler.
 
Son düzenleyen: Moderatör:
Uyarı! Bu konu 7 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı