Wczytywanie danych z pliku

Odpowiedz Nowy wątek
2019-11-21 22:44
0

Mam program z algorytmem, który ma wczytywać dane z pliku. W czasie kompilacji nie ma błędów ani ostrzeżeń, jednak w trakcie pojawia się błąd "naruszenia ochrony pamięci".

#include <cstdio>
#include <cstring>
#include <queue>
#include <stdlib.h>
#include <fstream>
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

// Mężczyźni i kobiety są reprezentowani przez liczby całkowite 1 ... N

// PrefM to lista preferencji wszystkich mężczyzn do wszystkich kobiet.
// PrefM[m][i] = k jeśli k jest na i-tej pozycji na liście preferencji m

// PrefK to lista preferencji wszystkich kobiet do wszystkich mężczyzn.
// PrefK[k][i] = m jeśli m jest na i-tej pozycji na liście preferencji k

// Ranking podaje ranking każdego mężczyzny na liście preferencji każdej kobiety
// Ranking[k][m] = i jeśli PrefK [k] [i] = m

// Partner daje bieżący "związek" każdej kobiety
// Partner[k] = m jeśli k jest obecnie związana z m

// Next podaje indeks następnej kobiety, której ma się oświadczyć wg listy preferencji każdego mężczyzny
// Next[m] = i jeśli m oświadczył się wszystkim k oraz PrefM[m][j] = k dla j = 1 ... i-1, ale nie PrefM[m][i]

int Ranking[505][505], PrefM[505][505], PrefK[505][505], Next[505], Partner[505];
int T, N, i, j, m, k;
queue <int> WolniM; //Wolni mężczyźni

void wczytaj() {

        string filename = "plik.txt";
        ifstream file;
        file.open(filename.c_str());

        string s;
        getline(file, s);
        stringstream ss(s);
        ss.str(s);
        ss.clear();
        ss >> N;

        for (i = 1; i <= N; i++) {
            //k=i; //scanf("%d", &k);
            //printf("Preferencje kobiety nr %d:\n", i);
            for (j = 1; j <= N; j++)
                //scanf("%d", &PrefK[i][j]);
                getline(file, s);
                ss.str(s);
                ss.clear();
                ss >> PrefK[i][j] >> PrefM[i][j];
        }

        file.close();

    for (i = 1; i <= N; i++)
        for (j = 1; j <= N; j++)
            Ranking[i][PrefK[i][j]] = j;

    memset(Partner, 0, N * sizeof(int));

    for (i = 1; i <= N; i++) {
            WolniM.push(i);
            Next[i] = 1;
        }
}           

void algorytm0 () {

        while (!WolniM.empty())    {
            m = WolniM.front();
            //printf("\nm=%d Next[m]=%d\n", m, Next[m]);
            k = PrefM[m][Next[m]++];
            //printf("k=%d Next[m]=%d\n", k, Next[m]);
            if (Partner[k] == 0)   {
                Partner[k] = m;
                WolniM.pop();
            } else if (Ranking[k][m] < Ranking[k][Partner[k]])  {
                WolniM.pop();
                WolniM.push(Partner[k]);
                Partner[k] = m;
            }
        }
}   
void wypisz() {
    printf("\nDobrane pary (m, k):\n");
        for (k = 1; k <= N; k++)
            printf("%d, %d\n", Partner[k], k);
}
int main()  {

    printf("Liczba testow: ");
    scanf("%d", &T);
    while (T--) {

        wczytaj();
        algorytm0();
        wypisz();

    }
    system("pause");
    return 0;
}

Pewnie jest coś nie tak z tym fragmentem funkcji wczytaj():

string filename = "plik.txt";
        ifstream file;
        file.open(filename.c_str());

        string s;
        getline(file, s);
        stringstream ss(s);
        ss.str(s);
        ss.clear();
        ss >> N;

        for (i = 1; i <= N; i++) {
            //k=i; //scanf("%d", &k);
            //printf("Preferencje kobiety nr %d:\n", i);
            for (j = 1; j <= N; j++)
                //scanf("%d", &PrefK[i][j]);
                getline(file, s);
                ss.str(s);
                ss.clear();
                ss >> PrefK[i][j] >> PrefM[i][j];
        }

        file.close();

Zauważyłem, że błąd pojawia się gdzieś mniej więcej po tym fragmencie i wczytywane dane nie są zgodne z plikiem.
plik.txt wygląda tak:

10
2 1
1 2
4 3
3 4
6 5
5 6
8 7
7 8
10 9
9 10

Bardzo proszę o pomoc :)

Nie Żartuj, Opisz ten algorytm, Debugowałeś? Linijka tekstu i kilka ekranów kodu? - lion137 2019-11-21 22:49

Pozostało 580 znaków

2019-11-21 22:53

Kompilator gcc wyrzuca to:

./main.cpp: In function ‘void wczytaj()’:
./main.cpp:50:13: warning: this ‘for’ clause does not guard... [-Wmisleading-indentation]
             for (j = 1; j <= N; j++)
             ^~~
./main.cpp:53:17: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘for’
                 ss.str(s);
                 ^~

w skrócie brakuje klamerek dla fora z 50 linijki (To nie python że klamerki robi się odstępami).

Pozostało 580 znaków

2019-11-21 23:48
0
Maly Brat napisał(a):

w skrócie brakuje klamerek dla fora z 50 linijki (To nie python że klamerki robi się odstępami).

Wiem, że to nie python. Przeoczenie, u mnie kompilator tego nie wychwycił. Dzięki za pomoc.

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