Prosty program z plikiem txt

0

Witam serdecznie.
Na wstępie chcę zaznaczyć iż jestem początkujący w programowaniu w C. Mój problem polega na tym, że chcę napisać program który zaimportuje dane z pliku .txt do programu a następnie wyexportuje te dane do drugiego pliku .txt. A także dodawanie/usuwanie/wyszukiwanie danych. Byłbym bardzo wdzięczny jeśli ktokolwiek mógłby mi pomóc. Pozdrawiam.

Przykładowy plik danych [nazwisko, imię, data, miejscowość, długość, nr serii]:
Stoch Kamil 2014-03-05 Lahti 125 1
Morgenstern Thomas 2014-03-05 Lahti 121 1
Schlierenzauer Gregor 2011-02-03 Vikersund 240 2
Amman Simon 2010-03-15 Oslo 130 1
Malysz Adam 2003-03-25 Planica 224.5 1
Stoch Kamil 2014-03-05 Lahti 121 2
Ljokelsoey Roar 2004-02-02 Oberstdorf 223.5 1
Ahonen Janne 2005-03-22 Planica 240 2
Malysz Adam 2001-02-02 Willingen 151.5 2
Funaki Kazuyoshi 1998-01-04 Innsbruck 117 1

2

Jakiej pomocy oczekujesz?
Poradniki do obsługi ciągów znaków oraz plików masz dostępne w internecie, więc do pracy, rodacy :P

0

Dziękuję za odpowiedź. Męczę się z tym programem już od 3 tygodni. Wiem, że dane z tego pliku musze umieścić w tablicy. I tak właśnie zrobiłem. Prawidłowo wypisuje mi całą zawartość tablicy na ekran, lecz gdy chcę tą tablicę zapisać do drugiego pliku txt, zapisuje mi losową liczbę sześciocyfrową.

1
grzesiex napisał(a):

Dziękuję za odpowiedź. Męczę się z tym programem już od 3 tygodni. Wiem, że dane z tego pliku musze umieścić w tablicy. I tak właśnie zrobiłem. Prawidłowo wypisuje mi całą zawartość tablicy na ekran, lecz gdy chcę tą tablicę zapisać do drugiego pliku txt, zapisuje mi losową liczbę sześciocyfrową.

  1. Zapisujesz rekordy jako wskaźniki zamiast ich dane
  2. Czy podzieliłeś rekordy na pola?
  3. Sugeruję pokazanie kodu ew. kontakt z którymś z ekspertów z wrozkitv.pl, np. http://www.wrozkitv.pl/ekspert/wrozbita-maciej
0

Wydaje mi się, że porgram otwiera plik jak należy i umieszcza go w tablicy dwuwymiarowej. Gorzej już jest z zapisem do drugiego pliku textowego. Oto mój kod. Wiem, że jest niechlujnie napisany i za to z góry przepraszam.

#include <stdio.h>

typedef struct
{
char name[50];
double data[12];
char skocznia[18];
float wynik[18];
int seria[2];
} SKOKI;

void zapis_do_tab(){
int i;
int j;
char tab[260][260],x;
FILE *plik;

for (j=0; j<260; j++)                 //wyzerowanie elementow tablicy
{
    for (i=0; i<260; i++)
    {
        tab[i][j]=0;
    }
}

plik=fopen("skoki.txt","r");
if (plik!=NULL)
{
    for (i=0; i<260; i++)
    {
        for(j=0; j<260; j++)
        {
            fscanf(plik,"%c",&x); //zapis to tab dwuwymiarowej
            tab[i][j]=x;
        }
    }
    // ~~~~~~~~~~~~~~~~~~~~~~~~DANE SA JUZ W TABLICY~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    fclose(plik);
}

else
{
    printf("Blad przy otwieraniu pliku");
}

for(i=0;i<260;i++)
{
    for(j=0;j<260;j++)
    {
        printf("%c",tab[i][j]); // WYPISANIE NA EKRAN

        plik = fopen("output.txt", "w");
        fprintf(plik,"%d\n", tab[i][j]);

        fclose(plik);
    }
}

}

void open_file(const char *skoki)
{
SKOKI p[6] = {0};
int i = 0;
FILE *plik = fopen("skoki.txt", "r");
if ( plik )
{

  char line[3000]; // czyta plik linia po linii

  while ( fgets(line, sizeof line, plik) && i < 6 )
  {
     fputs(line, stdout); // wyswietla linie pliku
     if ( sscanf(line, "%5c %50lf %10c %10f %3d",
                 p[i].name,
                 p[i].data,
                 p[i].skocznia,
                 p[i].wynik,
                 p[i].seria) == 5 )

       {
        printf("name = \"%c\"\n", p[i].name);
        printf("data = \"%lf\"\n", p[i].data);
        printf("skocznia = \"%c\"\n", p[i].skocznia);
        printf("wynik = \"%f\"\n", p[i].wynik);
        printf("seria = \"%d\"\n", p[i].seria);
        ++i;
        }
  }
  fclose(plik);

}
else
{
printf("Blad");
}
}
int main(void)
{
open_file("skoki.txt");
zapis_do_tab("skoki.txt");
return 0;
}

1
  1. Po co Ci to całe zapis_do_tab? Co to w ogóle robi?
  2. char line[3000]; aż tak długiej linii tam nie będziesz miał :P char line[256]; na 99% styknie.
1

Używaj tagów <cod​e=c>kod</co​de>

void zapis_do_tab()
//...
zapis_do_tab("skoki.txt")

fuj. Niby to jest poprawne w C89, ale jest również kompletnie bez sensu.

char tab[260][260]
// ...
fprintf(plik,"%d\n", tab[i][j]);

zapisujesz znaki jako liczby, więc najpewniej dostajesz ich kody ASCII.

0
Patryk27 napisał(a):

Po co Ci to całe zapis_do_tab? Co to w ogóle robi?

char line[3000]; aż tak długiej linii tam nie będziesz miał :P char line[256]; na 99% styknie.

  1. Rzeczywiście jest to niepotrzebne, lecz wydaje mi się, że ten struct nie działa jak należy i dlatego postanowiłem kombinować z inna funkcją.

Chciałbym dodać, że jestem kompletnym amatorem w programowaniu i nie mam pojęcia co robię na tych studiach informatycznych. No ale cóż, chciałbym chociaż zaliczyć ten projekt.

0
  1. Pobierz linijkę.
  2. Słowa linijki wrzuć do tablicy, otrzymasz, np.: tab[0] -> nazwisko, tab[1] -> imię.
  3. Skocz do następnej linii.
  4. Skocz do kroku 1.
0
  1. Nie używaj bez sensu inkrementacji przyrostkowej, for(i=0;i<10;++i) przeiteruje od 0 do 9 oraz unikniesz pewnych problemów później.
  2. Nie musisz zerować to co później wczytujesz.
  3. Dla indeksów tablic używaj size_t
    W związku z powyższym ta twoja zapis_do_tab powinna wyglądać następująco:
int zapis_do_tab(const char *inFileName,const char *outFileName)
  {
   size_t y,x;
   char tab[260][260]={{0}}; // od razu z wyzerowaniem
   FILE *fd;
   fd=fopen(inFileName,"r");
   if(!fd) return 1; // komunikaty w mainie
   for(y=0;y<260;++y) for(x=0;x<260;++x) fscanf(fd,"%c",&tab[y][x]);
   fclose(fd);
   for(y=0;y<260;++y,printf("\n")) for(x=0;x<260;++x) printf("%c",tab[y][x]);
   fd=fopen(outFileName,"w");
   if(!fd) return 2;
   for(y=0;y<260;++y,fprintf(fd,"\n")) for(x=0;x<260;++x) fprintf(fd,"%c",tab[y][x]);
   return 0;
  }
0

Postanowiłem od nowa napisać kod i udało mi się utworzyć całkiem zgrabny program, który importuje i exportuje dane z pliku pierwszego do drugiego.

 #include <stdio.h>

int main (void) {
    FILE *fin;
    FILE *fout;
    int c;
    int i=0;
    char line[256];

    fin = fopen ("skoki.txt", "r");
    while ( fgets(line, sizeof line, fin) && i < 256 )
         fputs(line, stdout);
    fin = fopen ("skoki.txt", "r");
    if (fin != NULL) {
        fout = fopen ("output.txt", "w");
        if (fout != NULL) {
            c = fgetc (fin);
            while (c >= 0) {
                fputc (c, fout);
                c = fgetc (fin);
            }
            fclose (fout);
        } else {
            fprintf (stderr, "Nie mozna zapisac do output.txt");
        }
        fclose (fin);
    } else {
        fprintf (stderr, "Nie mozna odczytac skoki.txt");
    }
    return 0;
}

Mam pytanie, czy do tego kodu mogę dodać funkcjonalność, która będzie usuwała i dodawała dane? Czy konieczne jest umieszczenie tych wszystkich danych w strukturze?
Pozdrawiam

0

Można, ale jakieś 10 razy prościej najpierw umieścić w strukturze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1