Odczyt z pliku i zapis do struktury

0

Witam.
Mój problem polega na odczytaniu pliku(wsp.txt) w formacie:

A(2,2)
B(5,6)
C(7,8)
D(5,1)
E(0,5)

Literki zapisujemy do tablicy
char nazwa[];
Cyfry to współrzędne odpowiednio x i y, także zapisujemy je do tablicy
int wsp[][];
Potem do strukrur:

struct miasto{
        char nazwa[10];
        int x;
        int y;
        int numer;
        bool odwiedzone;
};
struct miasto town[50];

struct sasiad{
        int krawedz;
        int odleglosc;
        int feromon;
};
struct sasiad neighbor[50];

Zapisujemy odpowiednio nazwę, numer i współrzędną danego miasta.
Potem na podstawie wsp obliczamy odległości miedzy miastami i zapisujemy je do struktury.
W tym momencie zwracam się do Was o pomoc w realizacji tego.
Nie oczekuje gotowego rozwiązania tylko wskazówek jak to zrobić :)
Oczywiście w języku C.

1

spróbuj odczytywać po jednym znaku z pliku i np jak napotkasz nawias otwierający to wiesz że pobrałeś już cała nazwę miasta i zaczynasz wczytywanie zmiennej x, kończysz kiedy napotkasz przecinek i masz kolejną zmienną itd.

0

Napisałem taki kod, niestety nie działa....

int czytaj_miasta(FILE *fp)
{

        int i = 0;
        char znak = ';';
        char c;
        char nazwa[50];
        if((fp=fopen("wspolrzedne.txt", "r")) == NULL)
          {
                printf("BŁĄÐ ODCZYTU!");
                exit(1);
          }
        while(!feof(fp))
          {
                c=fgetc(fp);
                nazwa[i] = c;
                if(c == znak)
                  {
                        c = fgetc(fp);
                        town[i].x = c;
                        c = fgetc(fp);
                        town[i].y = c;
                  }
                i++;
                 printf("%c", c);

           }




        fclose(fp);


} 

Przy formacie pliku:
LUBLIN;22
B;56
C;76
D;51
E;05

1
  1. Niepotrzebnie przekazujesz FILE* fp do funkcji. Wystarczy tworzyć lokalnie. Nigdzie przecież nie używasz tego wskaźnika poza funkcją. ;)

Kod dla pierwszego zapisu, czyli: 'Poznan(3,4)'
http://pastebin.com/21KyTjwU

0

dziękuje bardzo :)
Nie znałem wcześniej tego zapisu:

// %[^(] == pobierz znaki dopóki nie trafisz na nawias :-P
  scanf("%[^(](%d,%d)", city, &x, &y);
0

Nie chciałem zakładać nowego tematu.
Więc mam kolejny problem. Otóż procedura którą napisałem wyświetla mi macierz podwójnie oraz zapisuje ją w formacie ASCII czyli zamiast wyświetlic 1 wyświetla 48.
Nie wiem jak sobie z tym poradzić....

int odczyt_macierzy()
{
        int i,j;

        if((ftp=fopen("matrix.txt", "r")) == NULL)
        {
                printf("BLAÐ ODCZYTU!");
                exit(1);
        }


        while(!feof(ftp))
        {

                int i, j;  // niepotrzebne
                int c;

                for(i=0; i<5; i++)
                {
                        for(j=0; j<5; j++)
                        {
                                fscanf(ftp, "%d", &matrix[i][j]);
                        }

                }


                for ( i = 0; i < 5; i++ )
                {
                        for ( j = 0; j < 5; j++ )
                        {
                                printf("%2d", matrix[i][j]);

                        }
                        putchar('\n');

                }
        } // tutaj niepotrzenie while koncze :)
        fclose(ftp);


        printf("Matrix %d\n", matrix[2][4]);


        return 0;
}

matrix.txt

01111
10111
11011
11101
11110

PORADZIŁEM JUŻ SOBIE :)

0

Jeszcze taka ważna uwaga: przy scanf warto dodać liczbę oznaczającą ile wczytać znaków (po znaku procenta).
Czyli nie "%[(]", tylko "%20[(]", gdzie 20 to jest rozmiar tablicy odjąć jeden (ostatni to musi być znak '\0').

Gdybyś nie napisał liczby 20, to byś miał naruszenie ochrony pamięci przy wczytywaniu nazwy miasta większej niż 20.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.