Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wczytywanie tekstu w formie wierszy i kolumn

Ostatnio zmodyfikowano 2014-06-22 16:39
Autor Wiadomość
MrKreistos
Temat założony przez niniejszego użytkownika
Wczytywanie tekstu w formie wierszy i kolumn
» 2014-06-06 22:46:32
Chciałbym uzyskać coś w tym stylu:

to jes
t przy
kładow
y teks
t

chiałem to uzyskać przez:

C/C++
#include<iostream>

int main()
{
    int exit = 0;
    char text[ 6 ][ 10 ];
    int w_wierszu = 0;
    int w_kolumnie = 0;
    std::cout << "podaj tekst: ";
    for( w_kolumnie = 0; w_kolumnie < 10 || exit != 1; w_kolumnie++ )
    {
        for( w_wierszu = 0; w_wierszu < 6; w_wierszu++ )
        {
            std::cin >> text[ w_wierszu ][ w_kolumnie ];
            if( text[ w_wierszu ][ w_kolumnie ] == 0 )
            {
                exit = 1;
            }
        }
    }
   
    exit = 0;
    w_wierszu = 0;
    w_kolumnie = 0;
    for( w_kolumnie = 0; w_kolumnie < 10 || exit != 1; w_kolumnie++ )
    {
        for( w_wierszu = 0; w_wierszu < 6; w_wierszu++ )
        {
            std::cout << text[ w_wierszu ][ w_kolumnie ];
            if( text[ w_wierszu ][ w_kolumnie ] == 0 )
            {
                exit = 1;
            }
        }
    }
    return 0;
}

Ten kod to fragment programu który ma używać szyfru transpozycyjnego(pochodna szyfru przestawieniowego)
http://pl.wikipedia.org/wiki​/Szyfr_przestawieniowy

Wczytywanie miało się zatrzymać po wpisaniu tekstu i klepnięciu ENTER.
Proszę o pomoc.
P-111612
pekfos
» 2014-06-07 20:28:38
Chciałbym uzyskać coś w tym stylu:

to jes
t przy
kładow
y teks
t
Czyli, ze podczas wprowadzania danych automatycznie program będzie wyświetlał wpisywane dane w liniach po 6 znaków? Tego efektu nie uzyskasz z użyciem takich gotowców jak std::cin.
P-111671
MrKreistos
Temat założony przez niniejszego użytkownika
» 2014-06-11 15:17:47
Nie do końca. Chodzi raczej o to aby uzyskać taki szyk w tabeli dwuwymiarowej:

text[0][0]=t
text[0][1]=o
text[0][2]=_
text[0][3]=j
text[0][4]=e
text[0][5]=s
text[1][0]=t
text[1][1]=_
text[1][2]=p
text[1][3]=r
text[1][4]=z
text[1][5]=y
text[2][0]=k
text[2][1]=l
text[2][2]=a
text[2][3]=d
text[2][4]=o
text[2][5]=w
//itd

ale jestem oczywiście otwarty na propozycje użycia jakiś innych funkcji.
Program nie musi wyświetlać tego w takiej formie. Chodzi o samo wczytanie.
P-111927
pekfos
» 2014-06-11 15:34:09
Wczytaj linię do std::string a potem sobie podziel.
P-111930
Adik80
» 2014-06-11 16:10:07
A takie cos nie zadziala?:

C/C++
char s[ 10 ][ 6 ];
int lines = 0;
while( lines < 10 && std::cin.get( s[ lines ], 6 ).gcount() )
     ++lines;
P-111933
pekfos
» 2014-06-11 16:27:58
A takie cos nie zadziala?:
Sprawdź..?
P-111934
00Andre
» 2014-06-11 23:27:37
Jest to mój pomysł na zrobienie tego, trochę jest kodu ale działa poprawnie ;) (trochę się namęczyłem, ale udało się)
Program pobiera tekst z pliku, potem każdej linijki znak przypisuje do tablicy oraz jest obliczana ilość
kolumn i gdy będzie równe 6 to jest dodawany wiersz, a licznik kolumn ustawiony na 0.
Także jest liczone wszystkie znaki przepisane.

Przy wypisaniu to na ekran jest trochę trudniej. Ponieważ gdy zrobimy normalnie dwie pętle to wypisze te które są zaliczone do sześciu, a są teksty gdzie ilość znaków jest nie regularna i jest reszta z dzielenia przez 6 więc trzeba też je wypisać, więc jeśli nie jest równe to wypiszę resztę znaków
C/C++
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <windows.h>

int main()
{
    // zawartosc pliku
    std::vector < std::string > zawartosc;
    // podzielony linie
    char linia[ 50 ][ 6 ];
    // plik nasz
    std::fstream plik;
   
    // wyczytanie
    plik.open( "tekst.txt", std::ios::in );
   
    // sprawdzamy
    if( plik )
    {
        // Ustawiamy na poczatek kursor
        plik.seekp( 0, std::ios::beg );
       
        // wyczytujemy zawartosc pliku do vectora
        for( unsigned a = 0; !plik.eof(); a++ )
        {
            // Nasza linia
            std::string linia = "";
           
            // Wyczytujemy
            getline( plik, linia );
           
            // Wrzucamy do vectora
            zawartosc.push_back( linia );
        }
    }
   
    // Zamykamy plik
    plik.close();
   
    // Licznik wierszy przy dzieleniu na znaki
    int lwiersz = 0;
   
    // Licznik kolumn
    int lkolumn = 0;
   
    // Licznik wszystkich znakow
    int licznik_znakow = 0;
   
    // Dzielimy na kazdy znak i do tablicy
    for( unsigned a = 0; a < zawartosc.size(); a++ )
    {
        // druga petla
        for( unsigned b = 0; b < zawartosc[ a ].length(); b++ )
        {
            // Jesli kolumna wynosi 6 to
            if( lkolumn == 6 )
            {
                // Dodajemy do wiersza
                ++lwiersz;
               
                // Ustawiamy na 0
                lkolumn = 0;
            }
           
            // Ustawiamy znak
            linia[ lwiersz ][ lkolumn ] = zawartosc[ a ].at( b );
           
            // Dodajemy do kolumny
            ++lkolumn;
           
            // Dodajemy do licznika wszystkich znakow
            ++licznik_znakow;
        }
    }
   
    // Teraz wypisujemy
    // Jesli zawartosc jest podzielona na rowno bez reszty
    if( lwiersz * 6 == licznik_znakow )
    {
        // Wypisujemy
        for( unsigned a = 0; a < lwiersz; a++ )
        {
            for( unsigned b = 0; b < 6; b++ )
            {
                std::cout << "[" << a << "][" << b << "]: " << linia[ a ][ b ] << std::endl;
                Sleep( 500 );
            }
        }
    }
    // Jesli zawartosc zostala podzielona i zostala reszta
    else
    {
        // Jest to ostatni wiersz do ktorego reszta bedzie nalezala
        int ostatni_wiersz = lwiersz;
       
        // Wypisujemy normalnie jak przedtem
        for( unsigned a = 0; a < lwiersz; a++ )
        {
            for( unsigned b = 0; b < 6; b++ )
            {
                std::cout << "[" << a << "][" << b << "]: " << linia[ a ][ b ] << std::endl;
                Sleep( 500 );
            }
        }
       
        // Zmienna ktora bedzie przepisana reszta znakow z dzielenia
        int reszta = 0;
       
        // Ustawiamy reszte znakow
        reszta = licznik_znakow -( lwiersz * 6 );
       
        // Nasza zmienna dla kolumn
        int i = 0;
       
        // Wypisujemy reszte znakow
        for( unsigned a = lwiersz; a < lwiersz + reszta; a++ )
        {
            std::cout << "[" << ostatni_wiersz << "][" << i << "]: " << linia[ ostatni_wiersz ][ i ] << std::endl;
            Sleep( 500 );
           
            // Dodajemy do i
            ++i;
        }
    }
   
    return 0;
}

Wspomij o mnie jeśli tego użyjesz w jakimś swoim projekcie ;)
00Andre
P-111970
pekfos
» 2014-06-12 12:47:28
Wygląda na przekombinowane i nie chodziło o odczyt z pliku.

C/C++
for( unsigned a = 0; !plik.eof(); a++ )
2/3 bez sensu, reszta nie do końca poprawna.
P-111980
« 1 » 2 3
  Strona 1 z 3 Następna strona