Tablica char,plik tekstowy

Odpowiedz Nowy wątek
2016-11-21 14:53
0

Witam, wiem jak wczytać plik tekstowy do tablicy char ale nie potrafię zapisać to każdego elementu tablicy ciągu znaków,proszę o pomoc
Plik : abcdefg do tablicy zapisuje tab[0]=a itp a mi chodzi o to Plik : abc defg ghi do tablicy ma zapisywać tab[0]=abc itp

Pozostało 580 znaków

2016-11-21 15:34
1

5 sekund w google, wpisałem c++ read file.
http://www.cplusplus.com/doc/tutorial/files/

  ifstream myfile("example.txt");

  if (!myfile.is_open()) {
    cout << "Unable to open file"; 
    return 1;
  }

  string line;
  while (getline(myfile,line)) {
      cout << line << '\n';
  }
  myfile.close();

I masz w stringu.


edytowany 1x, ostatnio: TomRiddle, 2016-11-21 15:34

Pozostało 580 znaków

2016-11-21 15:59
0

Ale on nie zapisuje to tablicy ciagu znaków abc tylko pojedyncze znaki

Pozostało 580 znaków

2016-11-21 16:59
2

char to jest pojedynczy znak, więc tablica charów to tablica pojedynczych znaków. Ty chcesz mieć albo (bardzo tradycyjnie) tablicę wskaźników, albo (normalnie) wektor stringów.

edytowany 1x, ostatnio: Althorion, 2016-11-21 17:03

Pozostało 580 znaków

2016-11-21 17:30
1

W czym piszesz, w C czy C++?
W czystym C mógłbyś zastosować funkcję fscanf: http://www.cplusplus.com/reference/cstdio/fscanf/ która odczytuje znaki do pierwszego napotkanego znaku białego (czyli np spacji), kolejne wywołania funkcji scanf dadzą ci kolejne tablice znaków jak chciałeś:


char tekst1[20];
char tekst2[20];
char tekst3[20];

fscanf(fp, "%s", tekst1);
fscanf(fp, "%s", tekst2);
fscanf(fp, "%s", tekst3);

Tylko szkopuł jest taki że musiałbyś tworzyć tyle tablic ile ciągów znaków chcesz mieć.

Próbowałem to zrobić tak:

int main ()
{
    FILE *fp;
    char* tekst[200];
    int i = 0;

    if ((fp = fopen("test.txt", "r")) == NULL)
    {
        printf ("Nie mogę otworzyć pliku test.txt do zapisu!\n");
        exit(1);
    }

    while (fscanf(fp, "%s", tekst[i++]) != EOF)
    {
        printf(tekst[i - 1]);
    }

    fclose (fp);
    return 0;
}

Ale się wykrzacza, może ktoś będzie wiedział czemu, przecież funkcja oczekuje wskaźnika na chary to go otrzymuje, ale jednak jest crash.

W C++,na razie ci nie pomogę bo nie znam fscanf - nowy100 2016-11-21 17:36
A to było takie pytanie do bardziej obeznanych, może ktoś zobaczy i będzie wiedział czemu to się krzaczy, gdyby nie to rozwiązanie by było. - czaffik 2016-11-21 17:42
Za ten fscanf to lanie na goły tyłek. ;p - Xupicor 2016-11-21 18:38
ja się na tych funkcjach z C nie wyznaje :P - czaffik 2016-11-21 18:40
Większy grzech popełniłeś niż nieprzypisanie pamięci - użyłes &quot;%s&quot;, a to równoznaczne z gets(...). :P - Xupicor 2016-11-21 18:43

Pozostało 580 znaków

2016-11-21 17:49
czaffik napisał(a):

Ale się wykrzacza, może ktoś będzie wiedział czemu, przecież funkcja oczekuje wskaźnika na chary to go otrzymuje, ale jednak jest crash.
Funkcja oczekuje wskaźnika na obszar pamięci, do którego może zapisywać te znaki. Nie rezerwowałeś pamięci, wskaźnik wskazuje na nie wiadomo co, stąd crash to najlepsze co mogło Cię spotkać.

@nowy100

vector<string> texts;
string tmp;
while (getline(inputFile, tmp))
    texts.push_back(tmp);

Dobra, po przeczytaniu komentarzy zrozumiałem, że każdy string ma trzymać tylko jedno słowo, a nie całą linię, w takim razie ten kod powinien to zrobić (różnica jest jedynie w sposobie wczytania):

vector<string> texts;
string tmp;
while (inputFile >> tmp)
    texts.push_back(tmp);
edytowany 1x, ostatnio: twonek, 2016-11-21 18:16
Pokaż pozostałe 3 komentarze
poczytaj se o klasie vector z c++, push_back dodaje element na koniec tablicy (vector to taka cwańsza tablica), tylko jak się nie mylę to zapisze całą linię a nie np abc z linie pliku abc egf hjgs. - czaffik 2016-11-21 18:11
mógłbym wymienić string na char w vector<string>? - nowy100 2016-11-21 18:26
nie bo char to jeden znak, nie zmieścisz tam kilku znaków - czaffik 2016-11-21 18:32
Swego czasu trafiłem na taki art http://info.prelert.com/blog/stdgetline-is-the-poor-relation. Czy getline wciąż jest lekko upośledzony? - tajny_agent 2016-11-22 19:32

Pozostało 580 znaków

2016-11-21 18:00
0

Dzięki wielkie, pierwszy raz się spotykam z takim sposobem,nie mogłem nigdzie tego znaleźć

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