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++.
Moderatorzy:Jacek Bogusz, Moderatorzy
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 265 razy
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
bis
Oj "skapcaniales" Bis, "skapcaniales"... Jak my wszyscy
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... ).
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... ).
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;
}
Oczywiście, że to liczby rzeczywiste, sorka za taką gafę...W tym Twoim pliku nie ma liczb calkowitych !!!!
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...
Pod Borland C++ 5.01 też działa tylko tak jak napisałem wyżej. Dzięki za pomocprzynajmniej pod bashem dziala, tylko gcc zglasza warning o stare pliki naglowkowe...
Ostatnio zmieniony 6 cze 2006, o 08:36 przez JDawid, łącznie zmieniany 1 raz.
czyli pod systemem operacyjnym DOS ? czy w linii poleceń (konsoli tekstowej) Win ?Taki program potrzebuje uruchamiać pod DOSem
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ć?
wykonywalny plik exe chcę uruchamiać pod DOS 6.22.czyli pod systemem operacyjnym DOS ? czy w linii poleceń (konsoli tekstowej) Win ?
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.i czy liczba kolumn jest stała czy też może się zmienić?
czyli BC5....no to w takim razie wieczorkiem się odezwę, tego cuda teraz nie mam pod rękąPod Borland C++ 5.01 też działa(...)
[ 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 );
}
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".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...
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++.
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?!
Ta linijka ma wczytywać plik?! Nie wiem co jest źle, ale po wpisaniu całej ścieżki dostępu w taki sposób:
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ć.
Kod: Zaznacz cały
plik.open("plik.txt", ios::in);
Kod: Zaznacz cały
plik.open("dir:\plik.txt", ios::in);
to jest bez zmian.
Oczywiście doceniam pomoc, tylko jak gdzieś się mylę proszę mi wyjaśnić.
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).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?!
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++.Ta linijka ma wczytywać plik?!Kod: Zaznacz cały
plik.open("plik.txt", ios::in);
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).
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
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 ]
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
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;
a w Borlandzie to zapuszczę dopiero jak dotrę do domu, teraz mam tylko TC2.0
[ Dodano: 06-06-2006, 14:40 ]
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 253 razy
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'):
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;
}
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
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
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
a teraz sam programik:
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);
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;
}
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....
tasza
ps.
to pomiędzy ostatniego while-a i fclose(fz); - sprzątanie w pamięci...
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....
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 );
}
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości