Ĺadny brzuch
Witam. Mam taki oto programik:
#include "2.h" void Initialize() { root=new PROGRAM; root->FirstName[0]=0; root->LastName[0]=0; root->Age=0; root->Next=NULL; current=root; } PROGRAM *GetNext() { current = current->Next; return current; } PROGRAM *GetLast() { GetFirst(); while(current->Next!=NULL) GetNext(); return current; } PROGRAM *Add() { PROGRAM *nowy = new PROGRAM; nowy->FirstName[0]=0; nowy->LastName[0]=0; nowy->Age=0; nowy->Next=NULL; GetLast(); if(current->FirstName[0]==0&¤t->LastName[0]==0&¤t- >Age==0) {nowy=current; GetFirst();} else { current->Next = nowy; GetNext(); } return current; } void Export2File() { FILE *strumien; strumien=fopen("plik.bin","wb"); GetFirst(); while(current!=NULL) { fwrite(current->FirstName,sizeof(char),strlen(current->FirstName),strumien) ; fwrite(current->LastName,sizeof(char),strlen(current->LastName),strumien) ; fwrite(current->Age,sizeof(int),1, strumien); GetNext(); } fclose(strumien); } char Pobierz() { char name[50]; printf("Podaj nazwe pliku do zaimportowanie (wraz z rozszerzeniem): "); scanf("%s", name); Import(name); } void Import(char *filename) { FILE *strumien; strumien=fopen(filename,"wb"); GetFirst(); while(current!=NULL) { Add(); fread(current->FirstName,sizeof(char),strlen(current->FirstName),strumien) ; fread(current->LastName,sizeof(char),strlen(current->LastName),strumien) ; fread(current->Age,sizeof(int),1, strumien); } fclose(strumien); } void DeleteAll() { PROGRAM *p = GetFirst(); while (p != NULL) { GetNext(); delete p; p = current; } } void AddPerson() { char Nazwisko[100],Imie[100]; int Wiek; printf("\nPodaj imie: "); scanf("%s", Imie); printf("Podaj nazwisko: "); scanf("%s", Nazwisko); printf("Podaj wiek: "); scanf("%d", &Wiek); Add(); strcpy(current->LastName, Nazwisko); strcpy(current->FirstName, Imie); current->Age=Wiek; } void PrintPersonalData(PROGRAM *person) { if (person == NULL) return; printf("\nImie: %s\n", current->FirstName); printf("Nazwisko: %s\n", current->LastName); printf("Wiek: %d\n\n", current->Age); } void PrintAll() { GetFirst(); while(current != NULL) { PrintPersonalData(current); GetNext(); } } void Menu() { printf("MENU:\n"); printf("1- Nowa Osoba\n"); printf("2- Pokaz baze\n"); printf("3- Zapisz do pliku\n"); printf("4- Wczytaj baze z pliku\n"); printf("x- Koniec\n"); } int main() { int x, y, a; Initialize(); do { Menu(); switch(getch()) { case '1': AddPerson();system("cls");break; case '2': PrintAll();getch();system("cls");break; case '3': Export2File();system("cls");printf("Dane zapisane do plik.bin");getch();system("cls");break; case '4': Pobierz(); PrintAll(); case 'x': case 'X': DeleteAll(); return 0; default: system("cls"); printf("\nBlad!\n"); getch(); } } while(1); getch(); DeleteAll(); }
Powiedzmy, że wszystko jest ok, oprócz zapisu LICZBY typu integer do pliku binarnego. Pojawiają się jakieś krzaczki, ale tylko gdy postawię & przed current->Age, jeśli tego nie zrobię (czyli kod będzie taki jak powyżej), program wcale się nie kompiluję. Co jest nie tak? :) Proszę o pomoc ;)
Użytkownik maci3k edytował ten post 08 styczeń 2010, 19:18
fread(current->FirstName,sizeof(char),strlen(current- >FirstName),strumien); fread(current->LastName,sizeof(char),strlen(current->LastName),strumien) ;
Jest późno więc nie jestem pewien, ale skoro chcesz wczytać do tablicy char'ów tekst, to podanie jako ilość elementów do wczytania dlugości przez strlen nie jest chyba dobrym pomysłem, skoro jakby nie patrzeć, nie wiadomo co jest i co będzie w tablicy.
No tak, mimo późnej pory chyba masz rację ;) A co z tym intem, co mu nie pasuje? Taki bład wysypuje przy zacytowanym w I poście kodzie:
initializing argument 1 of `size_t fwrite(const void*, size_t, size_t, FILE*)'
Użytkownik maci3k edytował ten post 09 styczeń 2010, 08:46
Czy w konstruktorze inicjujesz wszystkie zmienne?
Plik .h
#ifndef __PERSON_H #define __PERSON_H #include <iostream> #include <conio.h> #include <stdio.h> #include <string.h> struct PROGRAM { char FirstName[20]; char LastName[20]; int Age; PROGRAM *Next; }; PROGRAM *root; PROGRAM *current; PROGRAM *GetNext(); PROGRAM *GetLast(); inline PROGRAM *GetFirst() {current=root; return root;} PROGRAM *Add(); void Export2File(); char Pobierz(); void Import(char *filename); #endif
Jeśli piszesz tak:
fwrite(¤t->Age,sizeof(int),1, strumien);
to wyskakują nadal te krzaczki?
Tak, podobnie, jesli zrobie tak: &(current->Age).
A w fread też dodajesz &? Bo w obu jako pierwszy parametr podać trzeba wskaźnik.
Skoro wskaznik, to przecież current jest wksaźnikiem, wiec fwrite powinno działać. A Fread w ogole się nie zajmuję na razie, bo chce żeby najpierw zapis podziałał ;)
Użytkownik maci3k edytował ten post 11 styczeń 2010, 12:36
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#include "2.h" void Initialize() { root=new PROGRAM; root->FirstName[0]=0; root->LastName[0]=0; root->Age=0; root->Next=NULL; current=root; } PROGRAM *GetNext() { current = current->Next; return current; } PROGRAM *GetLast() { GetFirst(); while(current->Next!=NULL) GetNext(); return current; } PROGRAM *Add() { PROGRAM *nowy = new PROGRAM; nowy->FirstName[0]=0; nowy->LastName[0]=0; nowy->Age=0; nowy->Next=NULL; GetLast(); if(current->FirstName[0]==0&¤t->LastName[0]==0&¤t- >Age==0) {nowy=current; GetFirst();} else { current->Next = nowy; GetNext(); } return current; } void Export2File() { FILE *strumien; strumien=fopen("plik.bin","wb"); GetFirst(); while(current!=NULL) { fwrite(current->FirstName,sizeof(char),strlen(current->FirstName),strumien) ; fwrite(current->LastName,sizeof(char),strlen(current->LastName),strumien) ; fwrite(current->Age,sizeof(int),1, strumien); GetNext(); } fclose(strumien); } char Pobierz() { char name[50]; printf("Podaj nazwe pliku do zaimportowanie (wraz z rozszerzeniem): "); scanf("%s", name); Import(name); } void Import(char *filename) { FILE *strumien; strumien=fopen(filename,"wb"); GetFirst(); while(current!=NULL) { Add(); fread(current->FirstName,sizeof(char),strlen(current->FirstName),strumien) ; fread(current->LastName,sizeof(char),strlen(current->LastName),strumien) ; fread(current->Age,sizeof(int),1, strumien); } fclose(strumien); } void DeleteAll() { PROGRAM *p = GetFirst(); while (p != NULL) { GetNext(); delete p; p = current; } } void AddPerson() { char Nazwisko[100],Imie[100]; int Wiek; printf("\nPodaj imie: "); scanf("%s", Imie); printf("Podaj nazwisko: "); scanf("%s", Nazwisko); printf("Podaj wiek: "); scanf("%d", &Wiek); Add(); strcpy(current->LastName, Nazwisko); strcpy(current->FirstName, Imie); current->Age=Wiek; } void PrintPersonalData(PROGRAM *person) { if (person == NULL) return; printf("\nImie: %s\n", current->FirstName); printf("Nazwisko: %s\n", current->LastName); printf("Wiek: %d\n\n", current->Age); } void PrintAll() { GetFirst(); while(current != NULL) { PrintPersonalData(current); GetNext(); } } void Menu() { printf("MENU:\n"); printf("1- Nowa Osoba\n"); printf("2- Pokaz baze\n"); printf("3- Zapisz do pliku\n"); printf("4- Wczytaj baze z pliku\n"); printf("x- Koniec\n"); } int main() { int x, y, a; Initialize(); do { Menu(); switch(getch()) { case '1': AddPerson();system("cls");break; case '2': PrintAll();getch();system("cls");break; case '3': Export2File();system("cls");printf("Dane zapisane do plik.bin");getch();system("cls");break; case '4': Pobierz(); PrintAll(); case 'x': case 'X': DeleteAll(); return 0; default: system("cls"); printf("\nBlad!\n"); getch(); } } while(1); getch(); DeleteAll(); }
Powiedzmy, że wszystko jest ok, oprócz zapisu LICZBY typu integer do pliku binarnego. Pojawiają się jakieś krzaczki, ale tylko gdy postawię & przed current->Age, jeśli tego nie zrobię (czyli kod będzie taki jak powyżej), program wcale się nie kompiluję. Co jest nie tak? :) Proszę o pomoc ;)
Użytkownik maci3k edytował ten post 08 styczeń 2010, 19:18
fread(current->FirstName,sizeof(char),strlen(current- >FirstName),strumien); fread(current->LastName,sizeof(char),strlen(current->LastName),strumien) ;
Jest późno więc nie jestem pewien, ale skoro chcesz wczytać do tablicy char'ów tekst, to podanie jako ilość elementów do wczytania dlugości przez strlen nie jest chyba dobrym pomysłem, skoro jakby nie patrzeć, nie wiadomo co jest i co będzie w tablicy.
No tak, mimo późnej pory chyba masz rację ;) A co z tym intem, co mu nie pasuje? Taki bład wysypuje przy zacytowanym w I poście kodzie:
initializing argument 1 of `size_t fwrite(const void*, size_t, size_t, FILE*)'
Użytkownik maci3k edytował ten post 09 styczeń 2010, 08:46
Czy w konstruktorze inicjujesz wszystkie zmienne?
Plik .h
#ifndef __PERSON_H #define __PERSON_H #include <iostream> #include <conio.h> #include <stdio.h> #include <string.h> struct PROGRAM { char FirstName[20]; char LastName[20]; int Age; PROGRAM *Next; }; PROGRAM *root; PROGRAM *current; PROGRAM *GetNext(); PROGRAM *GetLast(); inline PROGRAM *GetFirst() {current=root; return root;} PROGRAM *Add(); void Export2File(); char Pobierz(); void Import(char *filename); #endif
Jeśli piszesz tak:
fwrite(¤t->Age,sizeof(int),1, strumien);
to wyskakują nadal te krzaczki?
Tak, podobnie, jesli zrobie tak: &(current->Age).
A w fread też dodajesz &? Bo w obu jako pierwszy parametr podać trzeba wskaźnik.
Skoro wskaznik, to przecież current jest wksaźnikiem, wiec fwrite powinno działać. A Fread w ogole się nie zajmuję na razie, bo chce żeby najpierw zapis podziałał ;)
Użytkownik maci3k edytował ten post 11 styczeń 2010, 12:36