Pobieranie liczb typu int z pliku.txt [C++]

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
Enkidu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 139
Rejestracja: 10 wrz 2008, 12:10
Płeć: Mężczyzna
Wersja Ubuntu: 13.04
Środowisko graficzne: Unity
Architektura: x86_64

Pobieranie liczb typu int z pliku.txt [C++]

Post autor: Enkidu »

Cześć,

mam problem z napisaniem programu, który ma pobierać liczby typu int z pliku a potem zapisywać je na liście jednokierunkowej, a potem nimi operować w zadany sposób.
Mniejszym problemem jest też to, że nie do końca wiem jak wygląda plik z tymi liczbami, bo nie ma tego specyfikacji mojego zadania :/ Mogę chyba założyć, że są to pseudolosowe liczby int oddzielone spacjami.

Większy problem to pobieranie liczb z pliku. Próbowałem jakoś to zrobić za pomocą biblioteki fstream ale ona może pobierać tylko stringi lub binarki. Siedzę na tym już dwa dni, proszę o pomoc :pt36:
Awatar użytkownika
karmelek
Przyjaciel
Przyjaciel
Posty: 883
Rejestracja: 10 lut 2007, 17:45
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: Pobieranie liczb typu int z pliku.txt [C++]

Post autor: karmelek »

W C++ działa funkcja fscanf. Powinna pomóc.
Awatar użytkownika
Enkidu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 139
Rejestracja: 10 wrz 2008, 12:10
Płeć: Mężczyzna
Wersja Ubuntu: 13.04
Środowisko graficzne: Unity
Architektura: x86_64

Re: Pobieranie liczb typu int z pliku.txt [C++]

Post autor: Enkidu »

Napisałem coś takiego, ale nie działa dobrze:

Kod: Zaznacz cały

int liczba;
FILE *plik;
plik = fopen ("plik_z_danymi.txt","w+");
rewind (plik);
fscanf (plik, "%d", &liczba);
printf ("I have read: %d ",&liczba);
fclose (plik);
Awatar użytkownika
Enkidu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 139
Rejestracja: 10 wrz 2008, 12:10
Płeć: Mężczyzna
Wersja Ubuntu: 13.04
Środowisko graficzne: Unity
Architektura: x86_64

Re: Pobieranie liczb typu int z pliku.txt [C++]

Post autor: Enkidu »

Mój plik wygląda mniej więcej tak:

5 5 5 21544 548 44
454 8413 1621
...
...
...

Jak poradzić sobie z białymi znakami?
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: Pobieranie liczb typu int z pliku.txt [C++]

Post autor: beluosus »

C++ a kombinujesz z funkcjami C. Operator >> załatwia sprawę białych znaków.

Kod: Zaznacz cały

    ifstream file("liczby.txt");
    int i;
    while (file >> i)
    {
        cout << i << "\n";
    }
    file.close();
Awatar użytkownika
Enkidu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 139
Rejestracja: 10 wrz 2008, 12:10
Płeć: Mężczyzna
Wersja Ubuntu: 13.04
Środowisko graficzne: Unity
Architektura: x86_64

Re: Pobieranie liczb typu int z pliku.txt [C++]

Post autor: Enkidu »

Dzięki wielkie! Nie wiedziałem, że tak się można posłużyć operatorem: >> :roll:

Mam jeszcze ostatnie pytanie. Jak usunąć co n-ty element z listy, zaczynając od n-tego?
Lista wygląda sobie tak:

Kod: Zaznacz cały

struct List{
    int data;
    List *nast
};
a moja funkcja usuwająca elementy z niej tak:

Kod: Zaznacz cały

void usun(List *&head){
    int n;
    cin >> n;
    Lista *tmp;
    tmp = head;
    
    while (head != NULL){
        for (int i=0; i<n; i++){
            head = head->nast;
        }
    delete tmp;
    }
}
Ale to po kolei usuwa cała listę, a nie wybrane elementy. W którym momencie jest błąd?
bigfun
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 109
Rejestracja: 20 mar 2011, 19:08
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Warszawa
Kontakt:

Re: Pobieranie liczb typu int z pliku.txt [C++]

Post autor: bigfun »

Po pierwsze przesuwasz head, ale nie przesuwasz tmp. Po drugie nie zapewniasz wiązania między poprzednim elementem a następnym, przez co masz 'dziury' w strukturze. Po trzecie nie sprawdzasz w wewnętrznej pętli, czy przypadkiem nie doszedłeś już do końca.

Kod: Zaznacz cały

void usun(List *&head){
    int n;
    cin >> n;
    Lista *tmp;
    
    while (head != NULL){
        for (int i=0; i<n && head != NULL; i++){
            tmp = head;
            head = head->nast;
        }
    if (head != NULL)
    {
       tmp->nast = head->nast;
       delete head;
       head = tmp;
    }
    }
}
Pamiętaj jednak, że w ten sposób lista elementów "przesuwa się" w lewo, przez co element który wcześniej mógł być 2*n-tym elementem, po usunięciu n-tego będzie elementem o indeksie 2*n-1.

Osobną sprawą jest to, po co przekazujesz do funkcji wskaźnik do listy przez referencję. head będzie potej funkcji na pewno NULLem, a Ty chyba raczej chciałbyś zachować wskaźnik do początku listy...
"Never argue with idiot. He will drag you down to his level and then beat with experience."

Nie udzielam pomocy poza forum.
Awatar użytkownika
Enkidu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 139
Rejestracja: 10 wrz 2008, 12:10
Płeć: Mężczyzna
Wersja Ubuntu: 13.04
Środowisko graficzne: Unity
Architektura: x86_64

Re: Pobieranie liczb typu int z pliku.txt [C++]

Post autor: Enkidu »

Łał :) dzięki, nie wpadłbym na to z łączeniem fragmentów. Ale nadal po użyciu "usun" a potem mojej funkcji drukującej wyskakuje mi puste pole. Znowu całość się kasuje? :(
Awatar użytkownika
Enkidu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 139
Rejestracja: 10 wrz 2008, 12:10
Płeć: Mężczyzna
Wersja Ubuntu: 13.04
Środowisko graficzne: Unity
Architektura: x86_64

Re: Pobieranie liczb typu int z pliku.txt [C++]

Post autor: Enkidu »

Ach, no tak wystarczy usunąc &! Dzięki!
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości