c++ przekazywanie wskaźnika na tablice stringow do funkcji

0

witam. mam problem z przesyłaniem wskaźnika na tablice stringow do funkcji. caly program opiera sie na obsludze plikow. chce wpisac do tablicy strongiw po kolei kazde slowo z pliku binarnego.
moj kod jest podzielony na trzy pliki. w głownym w funkcji main mam

tekst tablica= czytaj(plik,ilosc);

gdzie tablica jest typu

typedef const string *tekst;

funkcja czytaj, według mnie powinna zwracać wskaźnik na tablicę do stringów więc moja funkcja czytaj wygląda tak

tekst czytaj(sciezka nazwa_pliku, int *ilosc){
    (*ilosc)=zlicz_slowa(nazwa_pliku);   //zmiana ilosc slow
    ifstream plik;
    plik.open(nazwa_pliku);

    string slowo[*ilosc];
    string *wsk;
    wsk=slowo;
    //wpisywanie w tablice
    int a;
    while(!plik.eof()){
        plik>>wsk[a];
        a++;
    }
    plik.close();
    return wsk;
}

niestety przy wypisywaniu po kolei słów w main'ie dopisują się jakieś dziwne znaczki i cyfry, ale w funkcji czytaj mogę to normalnie wypisać także myślę że coś jest źle z przesyłaniem do funkcji. z góry dzięki za pomoc.

0
  1. w C++ nie ma VLA.
  2. Chcesz przesłać wskaźnik na lokalną pamięć
  3. Twój typ tekst jest z czapy
  4. Twoje użycie wskaźników jest kompletnie z czapy
0

jakaś sugestia jak należycie trzeba by to zrobić?
może co pobranie słowa z pliku, alokować pamięć w tablicy a wskaźnik na pierwszy element wysłać potem do main'a?

1

std::copy_n z std::istream_iterator<string> i cała (i tak błędna) krwawica niepotrzebna.

Podobny problem, tyle, że z "liniami": http://4programmers.net/Forum/1128735

0

Jak już używać STL to na całego:

typedef std::vector<string> tekst;

Proponowane rozwianie z iteratorem też jest dobre, ale w przypadku getline nieco karkołomne.

Największy problem jednak to jest zła pętla while. funkcja eof zwraca true dopiero, gdy nastąpi próba czytania poza końcem pliku!
Efekt jest taki, że czytasz o jeden element za dużo.

Powinno być tak:

typedef std::vector<string> tekst;
tekst czytaj(const std::string &filename) {
    ifstream plik;
    plik.open(nazwa_pliku);
    tekst wynik;
    std::string s;

    while(plik>>wsk[a]) { // while(std::getline(plik, wsk[a])) {
        wynik.push_back(s);
    }
    plik.close();
    return wynik;
}
1

Ja bym to zrobił jakoś tak. Łapanie wyjątków czy obsługę błędów już dodasz sobie sam.

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

using namespace std;

void read_file(ifstream& fstr, vector<string>& vec) {
    typedef istream_iterator<string> istr_t;
    copy(istr_t(fstr), istr_t(), back_inserter(vec));
}

// Dla sprawdzenia.. 
int main(void) {
    vector<string> vec;

    ifstream file;
    file.open("data.txt");
    
    read_file(file, vec);

    copy(vec.cbegin(), vec.cend(), ostream_iterator<string>(cout, "|")); 
    file.close();
}

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