Skocz do zawartości

odczyt danych z pliku txt oraz oczytywanie danych z 1 stringa


Nirvan

Rekomendowane odpowiedzi

Chcę odczytać 150 liczb z pliku txt więc zrobiłem taki programik:

 

#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <stdlib.h>

using namespace std;

int main()
{
    int i=0,
    tablica[150];
    
    FILE*plik;
    plik=fopen("pesel.txt","r");
    
    
    if (plik ==NULL) perror("Nie ma takiego pliku!");
    else
    for(i=0; i<150; i++)
    {
        if (feof(plik)) break;
        fscanf(plik,"%d", &tablica[i]);
        cout << tablica[i] << endl;
    }    
    
    getchar();
    return 0;
}

 

 

Ale gdy je wypisuje to co któraś liczba ma myślnik na początku :|.

I czym zwrócić wartość pierwszej litery gdy jest string np kaczka to żeby mi k zwróciło i tak samo z tymi ze środka.

I ostatnia rzecz, przy funkcji fscanf w środku używa się "%d" na co to wpływa? Znalazlem tylko że to oddaje wartość całkowitą a "%s" string.

Bo chce też tak że jak będzie plik txt a w nim np.

 

Kaczka 2304 Plectropterus
Gęś 6344 Malacorhynchus

 

To chcę zapisać to do tablicy dwuwymiarowej ale nie wiem czego użyć żeby rozpoznawalo który wyraz jest skanowany i czy to następna linijka itd.

Odnośnik do komentarza
Udostępnij na innych stronach

Pokazuje że ma myslnik bo w końcu liczba ujemna też jest liczbą całkowitą :)

fscanf wczytuje poformatowany string, czyli jak zauważyłeś %d wczyta liczbe całkowitą. Jeśli chcesz więcej do tablicy dajesz fscanf(string, "%s %d %s") co ci da tablicę pokolei z odpowiednimi danymi.

Odnośnik do komentarza
Udostępnij na innych stronach

dzięki,a co do myślnika to wszystkie liczby w pliku są dodatnie :|

 

edit:

 

coś jest zrąbane, jak po odczytaniu wszystkim dałem wartość bezwzględną to poucinało kilka cyfer, a każda liczba w pliku ma taką samą długość.

I nie wiem co zmienia to "&" przy tablicy

 

edit2: Teraz się skapłem że liczby w pliku wychodzą o jedną cyfre poza zakres inta :D

ee itak nie dziala jak dalem double

 

a co do tej tablicy wielowymiarowej to nie dziala, jakbyś ty to zrobil?

(jakby trzeba bylo osobne tablice na string i na int itp)

Odnośnik do komentarza
Udostępnij na innych stronach

Siedze juz tyle czasu a nie znalazlem nic co by dobrze wczytywalo te pliki, jak juz to całą zawartość wypisuje poprawnie ale nie z osobna w tablicy, a do operacji na stringach z tym zwracaniem liter czego można użyć?

Odnośnik do komentarza
Udostępnij na innych stronach

no tak ale najpierw int przed tablica[150][4] np, ja chcialem żeby np dla tablica[2] były stringi

 

edit:

 

Chciałem napisać program który odczyta dane z pliku txt i wpisze je do tablicy.

Siedzę już przy tym ponad 4 godziny i ciągle coś jest nie tak.

Wczytują się niepoprawne liczby, postanowiłem przed chwilą eksperymentowac na prostych danych wiec zrobilem plik txt z liczbami od 0 do 9 oddzielone enterem i drugi plik z oddzielonymi spacją, ale wszystko ciągle źle się odczytuje :| raz 0 raz -43 raz 4231797, nie mam juz na to nerwów :\ pomóżcie.

Program wygląda tak:

 

#include <cstdio>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main()
{
    FILE *plik;
    int nrs[10], i=0;
    
    plik=fopen("nrs.txt","r");
    
    if (plik != NULL)
    {
        for (i=0;i<10;i++)
        {
        fscanf(plik, "%d", &nrs[i]);
        cout << nrs[i] << endl;
        }
                            fclose(plik);
    }
    else
    {
        perror("Nie ma takiego pliku!");
    }
    
    getchar();
    return 0;
}

Odnośnik do komentarza
Udostępnij na innych stronach

Może lepszym rozwiązaniem będzie również wczytywanie danych przez strumienie (fstream), zamiast fscanf.

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main() {
   fstream plik;
   plik.open("cotamjest.txt",fstream::in); // otwieramy plik do odczytu
   string str;
   while (plik.good()) { //czy z pliku mozna cokolwiek odczytac?
      plik >> str; //pobieramy slowo
      cout << str << endl; //wypisujemy je na ekran
   }
   return 0;
}

 

Poza tym, ujemne liczby mogą wyskakiwać, jeżeli przekroczysz maksymalną wartość inta ze znakiem (int przyjmuje wartości od -2,147,483,648 do 2,147,483,647).

możesz spróbować użyć typu unsigned long long zamiast samego int.

 

2. Zarówno w klasie string, jak i w tablicy charów, pierwszy znak możemy pobrać tak samo jak pobieramy elementy z tablicy, czyli: str[0].

 

3. Do przechowywania danych o kilku typach należy użyć struktur:

struct zwierze { // deklaracja struktury
string nazwa,gatunek;
int liczba;
};

// ...

zwierze z; // tworzenie struktury
zwierze.nazwa = "joda";
zwierze.liczba = 19;
zwierze.gatunek = "swieconcy";

Odnośnik do komentarza
Udostępnij na innych stronach

mógłbyś wyjaśnić to trochę bardziej, jakby miało to dzialac z plikiem w którym jest np 100 różnych zwierząt?

A co do tamtego to po częsci problem rozwiązany, odczytuje małę liczby ale jak chce odczytac np 12 liczbowe to nie idzie :| double i long long oddaje nie takie liczby jak trzeba :|

Odnośnik do komentarza
Udostępnij na innych stronach

No na przykład struktura pliku wejściowego wygląda tak:

joda 19 swieconcy
kapitan 4444 papryka
kaczka 1234 gumowa

 

- czyli w jednej linii 3 "słowa" (nazwa, liczba (nie wiem co ona oznacza), gatunek).

 

Kod na wczytanie wszystkiego w jedną tablicę wygląda tak:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

struct Zwierze { // deklarujemy strukture
   string nazwa, gatunek;
   unsigned long long liczba;
};

int main() {
   Zwierze zwierz[150]; // deklarujemy tablicę 150 zwierząt
   fstream plik;

   //przyklad odczytu

   plik.open("zwierzeta.txt",fstream::in);
      for (int i=0;i<150 && plik.good();i++) { // wczytujemy po kolei albo 150 zwierząt, albo tyle ile jest w pliku, gdy mniej niz 150.
         plik >> zwierz[i].nazwa; // wczytujemy najpierw nazwę
         plik >> zwierz[i].liczba; // teraz liczbę
         plik >> zwierz[i].gatunek; // i gatunek (wszystko w takiej samej kolejnosci jak w pliku)
         // przy wczytywaniu danych z pliku w taki sposob, nie ma znaczenia, czy separatorem danych jest odstęp, czy znak nowej linii
      }

   // przyklad zapisu

   cout << zwierz[5].nazwa << " " << zwierz[5].gatunek << endl; // wypisujemy nazwe i gatunek szóstego (bo indeksujemy od 0) zwierzęcia w tablicy (np. "joda swieconcy")

   return 0;
}

 

pisałem to mniej więcej z głowy (mogą być błędy).

Odnośnik do komentarza
Udostępnij na innych stronach

To jest jakieś rąbnięte, teraz chciałem w programie który odczytuje te nr pesel żeby mi ucięło dwie pierwsze liczby więc dałem cout << pesel % 1000000000 << endl; I ucina ale w większości o 1 za dużo a w innych poprawnie ;|

edit: aaa bo 0 ucina

Odnośnik do komentarza
Udostępnij na innych stronach

To jest jakieś rąbnięte, teraz chciałem w programie który odczytuje te nr pesel żeby mi ucięło dwie pierwsze liczby więc dałem cout << pesel % 1000000000 << endl; I ucina ale w większości o 1 za dużo a w innych poprawnie ;|

edit: aaa bo 0 ucina

Nie chcę nic mówić, ale robisz zadanie, które prawdopodobnie trzeba robić w Excelu.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...