Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Tablica z pliku txt w języku C/C++.

JDawid
-
-
Posty:38
Rejestracja:22 gru 2005, o 00:13
Lokalizacja:Rzeszów
Tablica z pliku txt w języku C/C++.

Postautor: JDawid » 5 cze 2006, o 17:25

Chiałbym liczby (całkowite) z pliku w załączniku mieć w tablicy, wie ktoś jak to zrobić. Ogólnie poptrzebuje programu, który z takiego plik jak w załączniku (może być wiecej liczb lub mniej w tym pliku, bo to są pewne wyniki) robi tablicę. Taki program potrzebuje uruchamiać pod DOSem.
Załączniki
do_tablicy.zip
(26.75KiB)Pobrany 266 razy

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 5 cze 2006, o 20:48

Jak byś tak coś.. tego.. bardziej obrazowo określił co chcesz uzskać( np. co to jest liczba całkowita w twoim rozumieniu i zawartości tego pliku) może chociaż napisz co to za tablica co to ją chcesz uzyskać(np. plik tekstowy, kod maszynowy na PIC16F617, fragment programu w C, inicjator tablicy ) albo jakiś przykładzik jak to ma wyglądać gdy w pliku jest 10 wartości... No nijak nie idzie skumać o co prosisz (Albo ja już tak skapcaniałem że nie rozumiem co tu piszą:()
bis

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 5 cze 2006, o 22:31

Oj "skapcaniales" Bis, "skapcaniales"... :twisted: Jak my wszyscy :mrgreen:


JDawid:
W tym Twoim pliku nie ma liczb calkowitych !!!!

Tak wstepnie przyjrzyj sie temu (dales dosc wolna reke jesli idzie o jezyk - C/C++ - wiec.... przynajmniej pod bashem dziala, tylko gcc zglasza warning o stare pliki naglowkowe... :mrgreen: ).

Kod: Zaznacz cały

#include<fstream.h> #include<iostream.h> int main () { fstream plik; float liczba; plik.open("plik.txt", ios::in); for (int i=0; i<20; i++) { plik >> liczba; cout << liczba << "\t\t\t" << (int)liczba << "\n"; } plik.close(); return 1; }

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 5 cze 2006, o 22:47

Nu ja mam troche inne wyobrażenia na temat "co to jest tablica?", no i liczba (zwłaszcza całkowita) jakoś tak inaczej..., ale jako "skapcanialec" głosu nie mam ;((
bis

JDawid
-
-
Posty:38
Rejestracja:22 gru 2005, o 00:13
Lokalizacja:Rzeszów

Postautor: JDawid » 6 cze 2006, o 07:46

W tym Twoim pliku nie ma liczb calkowitych !!!!
Oczywiście, że to liczby rzeczywiste, sorka za taką gafę...

Pajączek, co Twój program robi? Uruchomiony z katalogu gdzie jest tylko ten kod w pliku cpp coś wyświetla, niby skąd bierze dane do tablicy? I jak podstawić plik z danymi żeby Twój program zrobił z nich tablicę; wystarczy w tym samym katalogu i nazwa pliku taka jak w programie? Jeżeli tak miało być to tak nie działa...
przynajmniej pod bashem dziala, tylko gcc zglasza warning o stare pliki naglowkowe...
Pod Borland C++ 5.01 też działa tylko tak jak napisałem wyżej. Dzięki za pomoc :)
Ostatnio zmieniony 6 cze 2006, o 08:36 przez JDawid, łącznie zmieniany 1 raz.

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 6 cze 2006, o 08:31

Taki program potrzebuje uruchamiać pod DOSem
czyli pod systemem operacyjnym DOS ? czy w linii poleceń (konsoli tekstowej) Win ?
wybacz, że tak pytam....ale niektórzy to mylą...
zaczełam to wczoraj klecić w BorlandC 3.1 ale padłam na alokacjach pamięci :(
jak to może być np. w MSVC++ jako konsolówka - sofcik możesz mieć na
wczesne popołudnie....
i czy liczba kolumn jest stała czy też może się zmienić?

JDawid
-
-
Posty:38
Rejestracja:22 gru 2005, o 00:13
Lokalizacja:Rzeszów

Postautor: JDawid » 6 cze 2006, o 08:47

czyli pod systemem operacyjnym DOS ? czy w linii poleceń (konsoli tekstowej) Win ?
wykonywalny plik exe chcę uruchamiać pod DOS 6.22.
i czy liczba kolumn jest stała czy też może się zmienić?
ten plik jest macierzą i-wierszy na 9 kolumn lub na 13 kolumn, czyli liczba kolumn się nie zmienia; są tylko 2 przypadki, z tym że 1-sza kolumna nie jest ważna dla mnie, to tylko czas, nie są to ważne dla mnie dane z pomiarów.

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 6 cze 2006, o 08:53

Pod Borland C++ 5.01 też działa(...)
czyli BC5....no to w takim razie wieczorkiem się odezwę, tego cuda teraz nie mam pod ręką

[ Dodano: 06-06-2006, 10:23 ]

Kod: Zaznacz cały

#include <string> #include <vector> #define FILE_NAME_2_READ "D:\\jd\\odczyt\\dane.txt" typedef std::vector<double> TOneDataRow; typedef std::vector<TOneDataRow> TDataVector; std::string trim ( const std::string & s ) { if ( s.find_first_not_of(' ') == s.npos ) { return ( "" ); } return ( s.substr ( s.find_first_not_of(' '), s.find_last_not_of(' ') - s.find_first_not_of(' ') + 1 ) ); } void AppendDataRow ( char *pszLine , TDataVector *pvData ) { TOneDataRow newDataRow; char *pExit; char *pItem = strtok ( pszLine, " " ); while ( pItem != NULL ) { std::string sOneFloatItem ( pItem ); sOneFloatItem = trim ( sOneFloatItem ); if ( sOneFloatItem != "" ) { double dbl = strtod ( sOneFloatItem.c_str(), &pExit ); newDataRow.push_back ( dbl ); } pItem = strtok ( NULL, " " ); } pvData->push_back ( newDataRow ); } int main(int argc, char* argv[]) { // kontener na dane TDataVector vData; //otwarcie fila FILE *pF = fopen ( FILE_NAME_2_READ, "rt" ); if ( pF == NULL ) { printf ( "err\n" ); return ( 0 ); } //skan po rekordach z danymi while ( !feof( pF ) ) { char szT [ 0xFF ]; szT [ 0 ] = 0; fgets ( szT, 0xFF, pF ); // jeżeli niepusta linia to... std::string sL ( szT ); if ( trim ( sL ) != "" ) { // dostawianie nowych danych AppendDataRow ( szT , &vData); } } // zamknięcie fila fclose ( pF ); // zrzutka danych.... // dostęp do dowolnego elementu typu double // jest taki: vData[ rowek ][ columna ] for (int row = 0; row < vData.size(); row++ ) { printf ( "%03d: ", row ); for ( int col = 0; col < vData[ row ].size(); col++ ) { printf ( "%e ", vData[row][col] ); } printf ( "\n" ); } printf ( "\n\n" ); return ( 0 ); }

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 6 cze 2006, o 11:44

Pajączek, co Twój program robi? Uruchomiony z katalogu gdzie jest tylko ten kod w pliku cpp coś wyświetla, niby skąd bierze dane do tablicy? I jak podstawić plik z danymi żeby Twój program zrobił z nich tablicę; wystarczy w tym samym katalogu i nazwa pliku taka jak w programie? Jeżeli tak miało być to tak nie działa...
Narazie niewiele robi... odczytuje i wyswietla pierwsze 20 danych. Nie chodzilo mi o podanie Ci gotowego programu wg. zamowienia, tylko narazie sposobu odczytu tych danych (sadzilem ze sobie z tym nie radzisz, tak mi to brzmialo). Dalsze ustawinie tego w "tabele" to juz zabawa stringami i liczbami (i wysylaniem tego w odpowiednie strumienie). Ale tu faktycznie (jak powiedzial Bis) wypadalo by podac jakis przyklad wygladu tej "tabeli".
Co do zrodla danych... plik jak w kodzie, jak nie teges, to podaj z cala sciezka dostepu. Juz mowilem ze ja to pod gcc (w roznych wariantach) napisalem, nie mam teraz dostepnego innego kompilatora C/C++.

JDawid
-
-
Posty:38
Rejestracja:22 gru 2005, o 00:13
Lokalizacja:Rzeszów

Postautor: JDawid » 6 cze 2006, o 13:18

faktycznie coś wyświetla, ale 20 razy liczbę 6.184564e-11 w jednej kolumnie i 20 razy 0 w drugiej kolumnie... coś tu jest nie tak, chyba że stosowanie kompilatora Borland C ma taki wpływ?!

Kod: Zaznacz cały

plik.open("plik.txt", ios::in);
Ta linijka ma wczytywać plik?! Nie wiem co jest źle, ale po wpisaniu całej ścieżki dostępu w taki sposób:

Kod: Zaznacz cały

plik.open("dir:\plik.txt", ios::in);
gdzie dir:\ to jakiś folder na dysku, gdzie jest ten plik

to jest bez zmian.

Oczywiście doceniam pomoc, tylko jak gdzieś się mylę proszę mi wyjaśnić.

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 6 cze 2006, o 13:33

a może spróbuj uruchomić ten kawałek kodu, który wstawiłam wyżej....
on wczytuje cały Twój plik...dowolną liczbę z pliku masz dostępną przez vData[row][col]....

JDawid
-
-
Posty:38
Rejestracja:22 gru 2005, o 00:13
Lokalizacja:Rzeszów

Postautor: JDawid » 6 cze 2006, o 14:00

Takie są błędy po skompilowaniu Twojego kodu, jak możesz to trochę go wytłumacz... jest dośc skomplikowany

Obrazek

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 6 cze 2006, o 14:06

faktycznie coś wyświetla, ale 20 razy liczbę 6.184564e-11 w jednej kolumnie i 20 razy 0 w drugiej kolumnie... coś tu jest nie tak, chyba że stosowanie kompilatora Borland C ma taki wpływ?!
A to ciekawe, bo przyklad jest prawie ze zywcem wziety z Symfonii, w ktorej to p. Grebosz zazeka sie ze pisal "pod" Borlandem (choc w miare uniwersalnie). Powinien Ci wyswietlic 20 pierwszych liczb, w pierwszej kolumnie, w drugiej zas tylko czesci calkowite z tych liczb (to apropo tej Twojej wpadki z calkowitymi).

Kod: Zaznacz cały

plik.open("plik.txt", ios::in);
Ta linijka ma wczytywać plik?!
Ta linijka tylko "otwiera" plik do odczytu, wczytywanie poszczegolnych zmiennych jest w pierwszej linijce petli. A wogole to proponuje wybranie sie do biblioteki i przeczytanie choc czesci Symfonii p. Grebosza (obsluga plikow w III tomie), wiem ze czasu moze byc malo, ale to niezly wstep do C++.

A moze faktycznie wyprobuj to co Ci Tasza napisala... wyglada obiecujaco...
Tasza, a moze znajde MSVS, gdzies mialem triala, tylko gdzie.

Edit:
Aaa... widze, ze sprobowales ;) a nie masz tam gdzies pod reka Buildera C++, albo lepiej M$ VisualC (bo w tym to bylo pisane).

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 6 cze 2006, o 14:18

kompilator nie widzi plików nagłówkowych 'string' i 'vector'
one u mnie nie mają rozszerzenia *.h, ale to uroda MSVC...
musisz mu podać nazwy plików nagłówkowych z klasami STL-a...
jak się one nazywają i gdzie są - to powiedzą Ci przykładowe programy dołączane z Borlandem
poszukaj proszę w examplesach słowa vector, czy std::vector
i popatrz jak zadeklarowane są pliki nagłówkowe.... co jest w #include <?????>

nie jestem teraz pewna, ale być może w BC będziesz musiał jawnie podać
przestrzeń nazw, która jest wykorzystywana....ale niekoniecznie

Kod: Zaznacz cały

using namespace std; // <== to dopisać! typedef std::vector<double> TOneDataRow; typedef std::vector<TOneDataRow> TDataVector;
to dopiero jak będzie się dalej krzaczyć....

a w Borlandzie to zapuszczę dopiero jak dotrę do domu, teraz mam tylko TC2.0 :|

[ Dodano: 06-06-2006, 14:40 ]
:arrow: JDawid
w załączniku wersja z komentarzami....

[ Dodano: 06-06-2006, 20:07 ]
zainstalowałam BC5.02 - tylko takie było...
jedyne co mu zabrakło to #include <stdio.h> na początku,
Visual jakoś sobie poradził, zresztą to teraz nieistotne....
w trybie MSDOS (Platform DOS Standard) są warningi i jakieś komunikaty linkera...
ale exe powstaje i działa...
po przełączeniu IDE na Win32 - warningów od linkera nie ma - jest ok i też działa,
tylko że jako Win32 Console App...
deklaracje #include <vector> jest rozwijana do nazwy: c:c5includevector.h
<string> podobnie....ten STL to jest kod Hewlett-Packard z '94...
nie mam pojęcia, co może być u Ciebie nie tak...
przykro mi, ale chyba nie jestem w stanie pomóc...

[ Dodano: 07-06-2006, 14:54 ]
trochę głupio tak się poddać....

w załączniku wersja czytająca Twój plik zrobiona tylko i wyłącznie w C,
bez obiektów, STL-a i innych takich....
implementację dynamicznych array-ów znalazłam w necie - link w komentarzach...
wybrałam sobie te kawałki kodu, które mi były potrzebne, dostęp do dowolnego
elementu tabeli: double number = getElementAt ( dataRows, r, c );
jak się wyjdzie poza zakres - program krzyczy.
dane wczytane do pamięci, a potem zrzucone na dysk po przekierowniu stdout
dały plik identyczny ze źródłowym (w sensie wartości liczb)....i to tyle.

tasza
Załączniki
odczyt_czyste_C.zip
wersja 07-06-2006
(2.11KiB)Pobrany 388 razy
odczyt.zip
(1.89KiB)Pobrany 254 razy

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 7 cze 2006, o 21:12

Uf... wreszcie oderwalem sie od ksiazeczki o DSP... niezla, ale do tematu.

Ciagle nie mam nic poza gcc pod reka, dlatego o powyzszych przykladach nie chcialbym sie narazie wypowiadac. Moze w zamian zerkniecie na cos takiego (tym razem zgodne z ANSI C, wiec "powinno" pojsc na "wszystkim'):

Kod: Zaznacz cały

#include<stdio.h> #define PLIK_ZRODLOWY "plik.txt" #define PLIK_DOCELOWY "cel.txt" int main () { FILE *fz, *fd; float liczba; char znak; fz = fopen (PLIK_ZRODLOWY, "r"); // plik zrodlowy fd = fopen (PLIK_DOCELOWY, "w"); // plik docelowy if (! fz) { // blad odczytu, plik nie istnieje, badz inne klopoty printf ("A skad ja mam wziac dane do przetworzenia ??"); return 0; } while ((znak=getc(fz)) != EOF) { // zobacz czy to nie koniec pliku if (znak == '\n') fprintf (fd, "\n"); // zobacz czy nie koniec linii fscanf(fz, "%f", &liczba); // odczytaj liczbe zmienno-przecinkowa fprintf(fd, "%2.5f ", liczba); // wpisz powyzsza liczbe do drugiego pliu } // w formacie 2.5 fclose(fz); // pozamykaj pliki fclose(fd); return 1; }

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 8 cze 2006, o 01:35

fajne....tylko że czytasz i zaraz piszesz....
a tu chyba trzeba przeczytać całość - pomieć sobie - potem pisać...

znaczy się plik wczytać do pewnych struktur danych w programie,
a potem wykonywać różne na nich operacje - w szczególności wypisać na ekran

przynajmniej ja tak zrozumiałam pierwszy post....

tasza

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 8 cze 2006, o 22:00

No dobra Tasza... to cos bardziej rozbudowanego, i tak jak mowilas... wczytac wszystko, pomiec sobie i zapisac...

Wypadalo by jeszcze posprzatac po sobie, ale nie chcialo mi sie. Pozatym uklad jest testowy, a wypadalo by to po funkcjach rozbic... do zwalniania sluzy

Kod: Zaznacz cały

void free(void *ptr);
a teraz sam programik:

Kod: Zaznacz cały

#include<stdio.h> #define PLIK_ZRODLOWY "plik.txt" #define PLIK_DOCELOWY "cel.txt" #define ILE 9 struct line { // unia opisujaca pojedyncza linijke danych struct line *prev; struct line *next; float tab[ILE+1]; // a taki myk, by najwyzszy indeks byl = ILE, }; // co prawda 0 bedzie nieuzywane int main () { FILE *fz, *fd; float liczba; char znak; struct line *first, *last, *ptr; int i = 0; // pootwieranie plikow fz = fopen (PLIK_ZRODLOWY, "r"); // plik zrodlowy fd = fopen (PLIK_DOCELOWY, "w"); // plik docelowy if (! fz) { // jedyny obslugiwany blad - blad odczytu, plik nie istnieje, badz inne klopoty printf ("A skad ja mam wziasc dane do przetworzenia ??"); return 0; } // alokacja w pamieci unni pierwsza linijke last = first = (struct line*) malloc(sizeof(struct line)); first->next = first->prev = NULL; // odczyt z pliku zrodlowego while ((znak=getc(fz)) != EOF) { // zobacz czy to nie koniec pliku // if (znak == '\n') fprintf (fd, "\n"); // zobacz czy nie koniec linii fscanf(fz, "%f", &liczba); // odczytaj liczbe zmienno-przecinkowa last->tab[++i] = liczba; if (i == ILE) { // prawda jesli ostatni argument z linii i = 0; last->next = (struct line*)malloc(sizeof(struct line)); // nowy obszar pamieci last->next->prev = last; // i zaglerka wskaznikami dla niego last = last->next; last->next = NULL; // tak dla pewnosci } } // zapis do pliku docelowego ptr = first; // temp wskazuje na pierwszy while (ptr != NULL) { // wpisz powyzsza liczbe do drugiego pliu w formacie 2.5 for (i = 1; i<ILE+1; i++) fprintf(fd, "%2.5f ", ptr->tab[i]); fprintf(fd, "\n"); // nowa linia ptr = ptr->next; } fclose(fz); // pozamykaj pliki fclose(fd); return 1; }

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 8 cze 2006, o 22:24

aaale....utkałeś....
to chyba dobre rozwiązanie - prosta link-lista rekordów, ze stałą ilością floatów w wierszu...
w sumie kod jest bardzo prosty...fajne.... :roll:

tasza

ps.
to pomiędzy ostatniego while-a i fclose(fz); - sprzątanie w pamięci...

Kod: Zaznacz cały

ptr = first; // temp wskazuje na pierwszy line *pToDelete; // tymczasówka // iteruj, aż napotkasz null while ( ptr != NULL ) { pToDelete = ptr; ptr = ptr->next; free ( pToDelete ); }

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

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