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

Cevabınız için teşekkürler.
 
Son düzenleyen: Moderatör:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…