Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » Sherif 19:20
 » m&m 19:18
 » jenot 19:10
 » Dexter 19:09
 » Fl@sh 19:09
 » rulezDC 19:05
 » DYD 19:02
 » Chrisu 18:59
 » kyusi 18:58
 » rzymo 18:53
 » Chavez 18:50
 » Kenny 18:49
 » GLI 18:46
 » krismel 18:45
 » Janusz 18:45
 » DJopek 18:39
 » MARtiuS 18:30
 » muerte 18:28
 » @GUTEK@ 18:25
 » NWN 18:24

 Dzisiaj przeczytano
 41099 postów,
 wczoraj 25974

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2024
A R C H I W A L N A   W I A D O M O Ś Ć
    

Programowanie w C , mike013 6/01/06 23:22
Zwracam się o pomoć tutja bo może ktoś zna się na C lepiej odemnie. Pisałem już o tym na forum o C ale nikt mi nie wiedział jak to zrobić labo nie chciał mi powiedzieć.

Muszę napisać program, który m.in będzie wczytywał nazwista z kliku faktury.txt i zapisytał je do innego pliku (tym.txt) - no i właśnie z tym wczytywaniem nazwisk mam problem bo w pilku wynikowym (tym.txt) mam 2000000000000000... - (dwójkę i same zara)
Mógłby ktoś zerknąć w kod (pod kodem wkleję kilka linijek z pliku faktury.txt z którego mają być odczytywane nazwiska, bo oryginał ma 5 Mb)
Pisałem to w Borlandzie 3.11

#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

char klient[1300][20];
char faktura [250][13];
int poz=-1;
char data_f[8];

void lista_klientow(void);
void faktury_klienta(void);
void wyswietl_liste_faktur(void);
void obroty(void);
void podatek(void);
void szczegoly_faktury(void);
void opcja_d(void);
void sprawdz_powt(char nazwa[20]);
void wyswietl_liste(void);
void autor(void);



void main(void){
char wybor='1';
autor();
do{
clrscr();
printf("\tMENU: \n");
printf("\t\t1) Sortowanie klientow\n");
printf("\t\t2) numery faktur danego klienta\n");
printf("\t\t3) obroty netto danego klienta\n");
printf("\t\t4) kwota podatku danego klienta\n");
printf("\t\t5) szczegolowe informacje o wybranej fakturze\n");
printf("\t\td) opcja d\n");
printf("\t\tq) wyjscie z programu\n\n");
wybor=getch();
switch (wybor){
case '1' : lista_klientow(); break;
//case '2' : faktury_klienta(); break;
//case '3' : obroty(); break;
//case '4' : podatek(); break;
//case '5' : szczegoly_faktury(); break;
//case 'd' : opcja_d(); break;
}
}while(wybor!='q');
}

void autor(void){
clrscr();
printf("\n\t\t\tPodstawy informatyki - projekt\n\n");
printf("\t\t\tziom ziomistyczny\t\tgrupa 5\n");
printf("\t\t\tZESTAW nr 67\t\t\t opcja d\n\n\n\n\n\n\n");
printf("\t\t\t\t\t\tnacisnij dowolny klawisz...");
getch();
}


void lista_klientow(void){
FILE *plik, *plik1;
char nazwa_klienta[18];
char i,j,znak;
char tab[30];

for (i=0;i<80;i++)
printf("_");
printf("\n");
plik=fopen("faktury.txt","r");
if (plik==NULL){
printf("\tBlad otwarcia pliku 'faktury.txt'\n");
exit(1);
}
else{
printf("\tPlik 'faktury.txt' ...OK!\n");
printf("\twczytywanie klientow..."); }

plik1=fopen("tym.txt","w");
if (plik1==NULL){
printf("\tBlad otwarcia pliku 'tym.txt'\n");
exit(1);
}

for (j=0;j<=7;j++){
while(znak=getc(plik)!=';'); }

while(!feof(plik)){
while(znak=getc(plik)!=';');
while((znak=getc(plik))!=';' && znak!=EOF){
fputc(znak,plik1);
while(znak=getc(plik)!='\n'); }



}
fclose(plik);
fclose(plik1);
}

To są 4 wiersze z pliku o nazwie faktury.txt z którego program ma odczytać tylko nazwiska.

FAKTURA; KLIENT ;DATAFAK ;TERMIN;TRESC;WARTOSC; ROZLICZONE;
04C00008;OLEJNICZAK;2004-01-02 00:00:00.0;2004-01-09 00:00:00.0;obrót opakowaniami kaucjonowanymi;000500.00;000500.00;
04C00013;KRUK N.;2004-01-02 00:00:00.0;2004-01-02 00:00:00.0;03d94322;001490.00;001490.00;
04C00012;PIWGRUD;2004-01-02 00:00:00.0;2004-01-16 00:00:00.0;03d94306;003085.00;003085.00;
04B00002;PARAGON;2004-01-02 00:00:00.0;2004-01-02 00:00:00.0;Brak tresci;000074.28;000074.28;

Dziękuję dardzo za pomoc.

  1. szczerze mowiac , waski 6/01/06 23:32
    to nie chce mi sie przegladac calego kodu...
    imho zabawa w takie cos w C to troche metoda typu 'nago przez pokrzywy'
    w awk taki program zmiescisz pewnie w linijce, co najwyzej w dwoch :)

    SNAFU
    Situation Normal, All Fucked Up

    1. może i tak , mike013 6/01/06 23:55
      ale muszę to zrobić w C "jakie polecenie, takie wykonanie"

  2. no tak , beef 6/01/06 23:54
    Masz

    while(znak=getc(plik)!=';');

    a powinno być

    while((znak=getc(plik))!=';');

    Wpisz w helpie 'operator precedence' i wszystko stanie się jasne :) W skrócie - operator przypisania ma praktycznie najniższy prioryted. I, kurka:

    NAUCZ SIĘ KORZYSTAĆ Z DEBUGGERA!
    NAUCZ SIĘ KORZYSTAĆ Z DEBUGGERA!
    NAUCZ SIĘ KORZYSTAĆ Z DEBUGGERA!
    NAUCZ SIĘ KORZYSTAĆ Z DEBUGGERA!

    Bo inaczej prędko osiwiejesz. Taka przyjacielska rada człowieka z pewną praktyką :)

    this is the time of the revolution
    keepin' it in the right track
    feelin' it in my mind back

    1. hihi , beef 6/01/06 23:57
      Napisałem 'prioryted' :D To prawie jak 'objekt'. No cóż.

      ZA DUŻO PISANIA DOKUMENTACJI PO ANGIELSKU!
      ZA DUŻO PISANIA DOKUMENTACJI PO ANGIELSKU!
      ZA DUŻO PISANIA DOKUMENTACJI PO ANGIELSKU!

      ;)

      this is the time of the revolution
      keepin' it in the right track
      feelin' it in my mind back

    2. thx , mike013 7/01/06 00:04
      jest poprawa bo nie ma już warningów, ale w pliku wynikowym sięgle jest: 2000000000000000000000000...
      W kodzie jest chyba coś źle z odczytywaniem samych nazwisk bo one są:
      04C00013;KRUK N.;2004-01-02 00:00:00.0;2004-01-02 00:00:00.0;03d94322;001490.00;001490.00;
      Program ma odczytać z tego tylko nazwiska KRUK. Nie rozumiem przechedzenia znak po znaku.

  3. ten , mike013 7/01/06 00:15
    algorytm ma zczytać jeden ; odczytać nazwieko do koleknigo ; przeskoczyć jeszcze 6 ; i zrobić to samo w kolejnych wierszach. (mój program powiniem właśnie to robić).
    Można to zrobić jeszcze na kilka innych sposobów ale nie wiem jak zrobić żeby przeskakiwał te średniki ;

    Help

    1. pewnie można to zrobić i na 1000 sposobów, , beef 7/01/06 00:26
      ale ten poniżej pewnie jest jednym z krótszych:

      #define BUF_LEN 256
      char buffer[BUF_LEN+1];
      fgets(buffer, BUF_LEN, plik); // olanie pierwszej linii
      while (!feof(plik))
      {
      fgets(buffer, BUF_LEN, plik);
      strtok(buffer, ";"); // ominięcie tego numeru z początku
      char * surname = strtok(NULL, "; "); // pobranie nazwiska i zastąpienie spacji lub ; znakiem końca ciągu
      fputs(surname, plik1); // zapis do wyjścia
      fputs("\n", plik1); // ..plus enter
      }
      // v'oilla!

      Opuściłem otwieranie i zamykanie pliku. Do "przeskakiwania średników" (tudzież dowolnych innych znaków) służy właśnie funkcja 'strtok'. Acha, piwko ma być dobrze schłodzone :)

      this is the time of the revolution
      keepin' it in the right track
      feelin' it in my mind back

      1. Acha, test jednostkowy tego kodu wypadł pomyślnie :) , beef 7/01/06 00:27
        OLEJNICZAK
        KRUK
        PIWGRUD
        PARAGON

        O to chodziło?

        this is the time of the revolution
        keepin' it in the right track
        feelin' it in my mind back

        1. tak , mike013 7/01/06 12:05
          tylko jek jeszcze uwzględnić żeby zapisywałn na NRUK N a nie KRUK - jak uwzględnić żeby za spacją też odczytał?

          1. wywal spację po średniku... , beef 7/01/06 17:18
            ...w drugim 'strok'. Kurde, helpa Ci odinstalowało? Spróbuj czasem pomyśleć i poszperać samemu, przecież dostałeś rozwiązanie praktycznie na talerzu! Wystarczyło przecież nacisnąć F1 :) A potem będziesz narzekał w pracy, że mało płacą i nikt Cię nie docenia. Z takim podejściem do rozwiązywania problemów to kariery raczej nie zrobisz. CHCIEĆ TO MÓC.

            this is the time of the revolution
            keepin' it in the right track
            feelin' it in my mind back

  4. to samo ale w perlu , DrLamok 7/01/06 01:25
    #!/usr/bin/perl

    open(IN,"faktury.txt") || die;
    open(OUT,">tym.txt") || die;
    $skip = 1;
    while (<IN>) { if ($skip>0){$skip--; next;} my @line = split(/;/, $_); print OUT "$line[1]\n"; }
    close(OUT);
    close(IN);

    1. a w asemblerze ? : ) , recydywista 7/01/06 02:40
      1500 linijek kodu, ale za to plik wykonywalny zajmuje 200 bajtów i co drugie uruchomienie kasuje cmos (-:

      Computers are useless. They can only
      give you
      answers.

    2. mała poprawka , DrLamok 7/01/06 02:43
      #!/usr/bin/perl

      open(IN,"faktury.txt") || die; open(OUT,">tym.txt") || die; $skip = (<IN>);
      while(<IN>) {my @t=split(/;/,$_); my @li=split(/ /,$t[1]);print OUT "$li[0]\n"}
      close(OUT); close(IN);

      --
      to poprzednie nie uwzgledniało ze ma byc samo KRUK a nie KRUK N. teraz juz jest poprawnie

    3. to samo, ale w... , beef 7/01/06 17:23
      ...języku "Eszeregetewe-dżem":

      ó

      Język ten wymyśliłem przed chwilą. Powyższa instrukcja robi dokładnie to, co program powyżej, a nawet więcej, bo w tle wygrywa generowaną on-the-fly empetrójkę z muzyką ska. Ktoś mnie przebije w zwięzłości kodu?

      this is the time of the revolution
      keepin' it in the right track
      feelin' it in my mind back

      1. hehe... , xmac 8/01/06 11:28
        dobre ;_)
        musze sie do ciebie zglosic na korepetycje w tym nowym super jezyku, jaka oszczednosc miejsca, po prostu wow :_P

        dual&mobile power
        XMAC

    
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL