Wczytywanie z pliku tekstowego do tablicy, pomijanie określonego znaku.

0

Witam, staram się napisać odczyt z pliku tekstowego danych liczbowych które są pooddzielane znakiem średnika ';' .
Niestety każdy wiersz w pliku ma inną długość.
Napisałem pewien kod, ale niestety mimo braku błędów podczas kompilowania, aplikacja crashuje się na starcie. Jedno z miejsc które nie odpowiada aplikacji zlokalizowałem, ale nie wiem czemu mu to nie pasi.

Problem który znalazłem opisany jest w komentarzu w kodzie.

Przykładowa zawartość:

1;1;1;2;1;1;1;1;1;0;0;0;1;1;1;1;1;1;1;1;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
1;1;1;1;1;1;1;1;50;0;9;0;1;1;1;1;1;1;1;1;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;

void open()
{
    string tab3[20];
    int tab4[60][60];
    int x,y=0;
    string stringg;
    int dlug=0;
    char semicolon = ';';
    int k=0;
    fstream testfile;
    testfile.open("file1.txt", std::ios::in | std::ios::out);
    while(!testfile.eof())
    {
        getline(testfile, tab3[k]);
        k++;
    }
    for(int i=0; i<N; i++)
    {
        stringg=tab3[i];
        dlug=stringg.length();
        for(int j=0; j<dlug; j++) // <- jeden z problemów to j<dlug, z uwagi że wiersze mają różną długość to i ilość przejść pętli
        {                               //  powinna być różna, nie wiem jednak czemu mu to nie pasuje
            if (tab3[i][j]>3)
            {
                tab4[y][x]=tab3[i][j]+tab3[i][j+1];
                x++;
                if(x==60)
                {
                    y++;
                }
                cout<<"warunek 2"<<endl;
            }
            if (tab3[i][j]==';')
            {
                tab3[i][j]=tab3[i][j+1];
                cout<<"warunek"<<endl;
            }
        }
        dlug=0;
    }
    for(int i=0; i<N; ++i)
    {
        cout<<tab3[i]<<endl;
    }
    for(int i=0; i<60; i++)
    {
        for(int j=0; j<60; i++)
        {
            cout<<tab4[i][j];
        }
    }

    testfile.close();
}
0
tariel36 napisał(a)
        stringg=tab3[i];

Po co Ci to?

tariel36 napisał(a)
        dlug=stringg.length();
        for(int j=0; j<dlug; j++) // <- jeden z problemów to j<dlug, z uwagi że wiersze mają różną długość to i ilość przejść pętli
        {                               //  powinna być różna, nie wiem jednak czemu mu to nie pasuje

dlug to długość linii w znakach. j to ilość elementów w linii. Widzisz błąd?

tariel36 napisał(a)
            if (tab3[i][j]>3)

WTF?

Dalej już mi się nie chciało sprawdzać. Dane wczytujesz do tablicy o sztywnych rozmiarach, zamiast użyć np. wektorów, robisz wszystko naokoło, zamiast najzwyczajniej w świecie splitnąć linię po separatorze itp.

6

A co tam, nudzi mi się.

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>

int main()
{
	std::ifstream file("test.txt");
	
	std::vector<std::vector<int>> values;

	std::string line;
	while(std::getline(file, line))
	{
		std::string number;
		std::istringstream lineStream(line);
		std::vector<int> lineValues;

		while(std::getline(lineStream, number, ';'))
		{
			std::istringstream numberStream(number);
			int value;
			numberStream >> value;
			lineValues.push_back(value);
		}

		values.push_back(lineValues);
	}

	file.close();

	return 0;
}

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.