Wczytanie tekstu z pliku i zwrocenie indexow liter od ktorych zaczyaja sie slowa

0
#include<iostream>
#include<fstream>
#include<string>

using namespace std;

int main()
{
	string nazwa("dane.txt");
	ifstream plik(nazwa.c_str());
	if(!plik.good())
	{
		cout << "blad ! " << endl;
		return 0;
	}
	int ile_wyrazow=0;
	string tmp;
	while(!plik.eof())
	{
		plik >> tmp;
		ile_wyrazow++;
	};
	cout << "wyrazow jest: " << ile_wyrazow << endl;
	plik.seekg(0);
	int *indexy = new int [ile_wyrazow];
	for(int i=0; i<ile_wyrazow; i++)
	{
		plik >> tmp;
		indexy[i] = plik.tellg();
	}


	cout << "Tablica z indexami wyrazow: " << endl;
	for(int i=0; i<ile_wyrazow; i++)
	{
		cout << indexy[i] << "\t";
	}
	return 0;
}

czemu nie działa i wypisuje tylko -1 ?

0
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
 
int main()
  {
   ifstream plik("dane.txt");
   if(!plik)
     {
      cout<<"brak pliku"<<endl;
      return 1;
     }
   int ile_wyrazow=0;
   string tmp;
   while(plik>>tmp) ++ile_wyrazow;
   cout<<"wyrazow jest: "<<ile_wyrazow<<endl;
   plik.clear();
   plik.seekg(0,ios::beg);
   unsigned *indexy=new unsigned[ile_wyrazow];
   for(int i=0;i<ile_wyrazow;indexy[i++]=plik.tellg()) plik>>tmp;
   plik.close();
   cout<<"Tablica z indexami wyrazow:"<<endl;
   for(int i=0;i<ile_wyrazow;++i) cout<<indexy[i]<<"\t";
   return 0;
  }
0

Po dojściu do końca pliku zapala się flaga eof. Aby móc znowu czytać ten plik trzeb tą flagę wyczyścić (plik.clear()).

Błąd popełniłeś również w sposobie wczytywania. Flaga eof zapali się dopiero podczas próby odczytu poza końcem pliku. Dlatego powinieneś:

  1. Najpierw wczytać wartość z pliku
  2. Następnie sprawdzić flagi aby potwierdzić, że wczytanie się powiodło
  3. Jeśli wszystko ok to zapisujesz wczytaną wartość

Jeszcze jednym błędem było to, że sprawdzałeś pozycję znaku (tellg) po wczytaniu słowa, ale nie odjąłeś długości słowa więc dostawałeś pozycję za ostatnim znakiem, a nie pozycję pierwszego znaku jak w zadaniu.

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