Odczyt pliku txt i zapis do tablicy dwuwymiarowej

Odpowiedz Nowy wątek
2011-08-02 21:44
0

Witam.

Problem polega na tym, ze chce na poczatku odczytac z pliku, a dokladnie z macierzy sasiedztwa polaczenia miedzy konkretnymi wierzcholkami grafu, np.

01010
10011
00011
11101
01110

Potem trzeba zapisac to do tablicy dwuwymiarowej bool MS[VMAX+1][VMAX+1];
Kolejnym elementem nad ktorym sie obecnie zastanawiam jest odczyt drugiego pliku w postaci

A(1,2)
B(5,8)
C(2,7)
D(4,1)
E(3,5)

lub

(1,2)
(5,8)
(2,7)
(4,1)
(3,5)

Jak komu wygodniej. Sa to wspolzedne miast(problem komiwojazera).
Przykład nie oznacza że mamy się ograniczyć do 5 miast.
Nastepnie trzeba wyliczyc odleglosci miedzy miastami.

Pseudo kod to:

Function PoliczOdlegloscPomiedzyMiastami M1 i M2
  szer = WspMiast(1, M1) - WspMiast(1, M2)
  wys = WspMiast(2, M1) - WspMiast(2, M2)
  PoliczOdleglosc = Sqr(szer ^ 2 + wys ^ 2)
  If MaksymalnaOdleglosc < PoliczOdleglosc Then
    MaksymalnaOdleglosc = PoliczOdleglosc
  End If
End Function

Function PoliczDlugoscTrasy()
 For i = 1 To LiczbaMiast
   If i = LiczbaMiast Then 
      a = 1
     Else a = i + 1
   End If
  PoliczDlugoscTrasy = PoliczDlugoscTrasy + PoliczOdleglosc(i, a)
End Function

Poradze sobie z napisaniem tego w c/c++.
Nastepnie graf wygeneruje juz sam.

Zatem chcialbyym prosic o pomoc w nastepujacych zagadnieniach:

  1. Fukcja do odczytu z macierzy i zapisu do tablicy dwuwymiarowej(moze byc pseudo kod lub porady).
  2. Koncepcja zrealizowania calosci czyli:
    odczyt macierzy z pliku
    obliczenie odleglosci miedzy miastami
    *wygenerowanie grafu

Dotychczas udalo mi sie napisac takie cos:

#include "miasta.h"
#include <stdio.h>

const int VMAX 32 //  max liczba wierzcholkow
bool MS[VMAX+1][VMAX+1]; // macierz sasiedztwa
int n; // faktyczna liczba wierzcholkow w grafie
int m; // liczba krawedzi

// zmienne macierzy
FILE *fp // plik macierz sasiedztwa
char znak []=" "; // spacja do czytania odstepu miedzy liczbami
string liczba; // liczba odczytana z macierzy

void zeruj_MS() // funkcja zeruje macierz sasiedztwa
{
  for(int i = 1; i <= VMAX; i++)
    for(int j = 1; j <= VMAX; j++)
      AM[i][j] = false;
}

void read_AM() // odczyt macierzy
{
  n = 0;
  cin >> m;
  if ((fp=fopen("macierz_sasiedztwa.txt", "w"))==NULL) 
     {
       printf ("Nie moge; otworzyc' pliku macierz_sasiedztwa.txt do odczytu!\n");
       exit(1)
  else
       while(getline(fp, wers[licznik])){
                      cout<<wers[licznik]<<endl;
                      licznik++;
                      }

     }

Pozostało 580 znaków

2011-08-03 00:24
0

Poradze sobie z napisaniem tego w c/c++.
to w C czy w C++? w tej chwili piszesz w C z dwiema linijkami typowego C++.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
const int VMAX=32;
 
typedef bool Matrix[VMAX+1][VMAX+1];
 
bool readMatrix(const string &fileName, Matrix &matrix)
{
   ifstream fp(fileName);
   if (!fp)
   {
       cout<<"Nie mogę otworzyć pliku "<<fileName<<" do odczytu!"<<endl;
       return false;
   }
   for (int i=0;i<VMAX;i++)
   {
     string line;
     if (!getline(fp,line) || line.length()<VMAX)
     {
        cout<<"Błąd podczas odczytu pliku (plik za krótki?)"<<endl;
        return false;
     }
     for (int j=0;j<VMAX;j++)
        matrix[i][j] = line[j]-'0';
   }
   return true;
}
 
void printMatrix(const Matrix &matrix)
{
   for (int i=0; i<VMAX; i++)
   {
      for (int j=0; j<VMAX; j++)
         cout<<matrix[i][j]<<' ';
      cout<<endl;
   }
}
 
int main()
{
   Matrix MS;
   if (readMatrix("macierz_sasiedztwa.txt",MS))
      printMatrix(MS);
}

Pozostało 580 znaków

2011-08-06 16:49
0

Na poczatku chce podziekowac za odpowiedz.

Po malych poprawkach i kompilacji jest problem..

otoz ten warunek zwraca false(przy okazji moze mi ktos dokladniej wytlumaczyc dzialanie tego if'a?)

if (!getline(fp,line) || line.length()<VMAX)
       {
         cout<<"B?a;d podczas odczytu pliku (plik za krótki?)"<<endl;
         return false;
       } 

dla pliku macierzy sasiedztwa

01010
10011
00011
11101
01110 

Glowny kod programu:

 #include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
const int VMAX=32;
 
typedef bool Matrix[VMAX+1][VMAX+1];
 
ifstream fp("macierz_sasiedztwa.txt");
 
bool readMatrix(const string &macierz_sasiedztwa, Matrix &matrix)
{
string line;
   if (!fp)
   {
       cout<<"Nie moge otworzyc' pliku "<<macierz_sasiedztwa<<" do odczytu!"<<endl;
       return false;
   }
   for (int i=0;i<VMAX;i++)
   {
      if (!getline(fp,line) || line.length()<VMAX)
       {
         cout<<"B?a;d podczas odczytu pliku (plik za krótki?)"<<endl;
         return false;
       }
      for (int j=0;j<VMAX;j++)
        matrix[i][j] = line[j]-'0';
   }
    return true;
}
 
void printMatrix(const Matrix &matrix)
{
   for (int i=0; i<VMAX; i++)
   {
      for (int j=0; j<VMAX; j++)
         cout<<matrix[i][j]<<' ';
      cout<<endl;
   }
}
 
int main()
{
   Matrix MS;
   if (readMatrix("macierz_sasiedztwa",MS))
      printMatrix(MS);
}
edytowany 1x, ostatnio: antoniaklja, 2011-08-06 16:55

Pozostało 580 znaków

2011-08-07 02:20
0

skoro VMAX masz 32, to nie spodziewaj się wczytania pliku, który ma macierz 5x5.

Pozostało 580 znaków

2011-08-07 02:31
0

czyli wnioskujac z Twojej odpowiedzi warunkiem moze byc EOF zamiast VMAX?
Tyle, ze w if'ie jest napisane

if (!getline(fp,line) || line.length()<VMAX)

co znaczy jesli warunek nie jest mniejszy od VMAX czego nie rozumiem..

edytowany 1x, ostatnio: antoniaklja, 2011-08-07 02:32

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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