Odczyt z pliku

0

Próbuje zrobić tak aby z pliku mi odczytało i potem zapisało z powrotem w skróconej wersji. Potrzebuje id który zwiększa się o 1 po każdej lini, idp i lvl ktore są z lini wczytanej z pliku. Chce je zapisać tak id; idp; lvl. I tak wygląda kod tylko że przy lvl wypisuje mi niepoprawne wartości:

#include<iostream>
#include<fstream>
#include<cctype>
using namespace std;
fstream tabela;
string dana;
int id, idp, lvl;
void open()
{
    if(tabela.good()==true) cout<<"Uzyskano dostep do pliku!"<<endl;
    else cout<<"Dostep do pliku zostal zabroniony!"<<endl;
}
int del(string dana)
{
    idp=0;
    idp=(dana[0]-'0')*100+((dana[1]-'0')*10)+(dana[2]-'0');
    if(dana.size()!='-' || dana.size()!='\'')
    {
        lvl=dana[dana.size()-1]*10;
        lvl+=dana[dana.size()];
    }
    else
    {
        lvl=101;
    }
    return idp,lvl;

}
int main()
{
    string zapis;
    tabela.open( "tabela.txt", ios::in | ios::out);
    open();
    id=0;
    while(!tabela.eof())
    {
        getline(tabela, dana);
        del(dana);
        cout<<id<<" "<<idp<<" "<<lvl-'0'<<" "<<endl;
        zapis=id+'0';
        zapis+="; ";
        zapis+=idp+'0';
        zapis+="; ";
        zapis+=lvl+'0';
        //tabela>>zapis;
        id++;

    }

}

Plik z którego czytam wygląda tak:

 043 	test1 t 	-- 	-- 	-- 	-- 	-- 	--
044 	 	-- 	-- 	-- 	-- 	-- 	--
045 	 	  	-- 	-- 	  	  	'
114 	29 	27 	10 	10 	8 	8 	10 	10
140 	34 	10 	13 	6 	6 	6
141 	--, 34 	--, 10 	--, 13 	--, 6 	--, 6 	--, 6
182 	-- 	-- 	  	  	'
191 	-- 	-- 	-- 	-- 	--

Idp biore z 3 pierwszych znaków, lvl z 1/2 ostatnim znaków jeśli ostatni znak nie jest cyfrą to ma wpisać 101. Wie ktoś czemu to nie działa

0

tu dana.size()!='-' sprawdzasz czy długość napisu nie jest równo 45 znaków
Może podaj co chcesz z tego pliku uzyskać.

0

Według tego pliku co podałem to:
1; 43; 101
2; 44; 101
3; 45; 101
4; 114; 10
5; 140; 6
6; 182; 101
7; 191; 101

Jeśli chodzi o te porównanie ostatniego znaku to poprawiłem, chyba tak jak powinno być, oto wersja poprawiona. Lecz nie zwraca takiego wyniku jaki powinien być.

#include<iostream>
#include<fstream>
#include<cctype>
using namespace std;
fstream tabela;
string dana;
int id, idp, lvl;
void open()
{
    if(tabela.good()==true) cout<<"Uzyskano dostep do pliku!"<<endl;
    else cout<<"Dostep do pliku zostal zabroniony!"<<endl;
}
int del(string dana)
{
    idp=0;
    idp=(dana[0]-'0')*100+((dana[1]-'0')*10)+(dana[2]-'0');
    if(dana[dana.size()]!='-' || dana[dana.size()]!='\'')
    {
        lvl=dana[dana.size()];
        if(dana[dana.size()-1]!='-' || dana[dana.size()-1]!='\'')
        lvl+=dana[dana.size()-1]*10;

    }
    else lvl=101;
    return idp,lvl;

}
int main()
{
    string zapis;
    tabela.open( "tabela.txt", ios::in | ios::out);
    open();
    id=0;
    while(!tabela.eof())
    {
        getline(tabela, dana);
        del(dana);
        cout<<id<<" "<<idp<<" "<<lvl<<" "<<endl;
        zapis=id+'0';
        zapis+="; ";
        zapis+=idp+'0';
        zapis+="; ";
        zapis+=lvl+'0';
        //tabela>>zapis;
        id++;

    }

}
 
0
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

int main()
  {
   string line;
   ifstream fin("tabela.txt");
   ostringstream sout;
   for(unsigned id=1,idp,lvl;getline(fin>>idp,line);++id)
     {
      istringstream sin(line);
      for(;sin.get()!=EOF;sin.clear()) sin>>lvl;
      if(!lvl) lvl=101;
      cout<<id<<' '<<idp<<' '<<lvl<<endl;
      sout<<id<<"; "<<idp<<"; "<<lvl<<endl;
     }
   fin.close();
   ofstream fout("-tabela.txt");
   fout<<sout.str();
   fout.close();
   return 0;
  }
0

Dobra to działa, ale jeśli musze sprawdzić ostatni znak to jak zrobić to, bo jeśli ostatnim znakiem jest " - " to musi byc 1 a jeśli " ' " to 101 XD Wybacz że nie wspomniałem o tym wcześniej.

0
if(!lvl) lvl=(line.back()=='-'?1:101);
0
‘std::string’ has no member named ‘back’| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
 

Dostaje taki komunikat...

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

int main()
  {
   string line;
   ifstream fin("tabela.txt");
   ostringstream sout;
   for(unsigned id=1,idp,lvl;getline(fin>>idp,line);++id)
     {
      istringstream sin(line);
      for(;sin.get()!=EOF;sin.clear()) sin>>lvl;
      if(!lvl) lvl=(line.back()=='-'?1:101);
      cout<<id<<' '<<idp<<' '<<lvl<<endl;
      sout<<id<<"; "<<idp<<"; "<<lvl<<endl;
     }
   fin.close();
   ofstream fout("-tabela.txt");
   fout<<sout.str();
   fout.close();
   return 0;
  }
 
0

To chyba będzie ostatnia rzecz. Otóż przemyślałem ten program jeszcze raz i chciałbym aby dopisywał na koniec pliku XD Możesz mi powiedzieć jak to zrobić?

0

Z czym konkretnie masz problem?

0

To ja może opowiem na czym mi zależy :D Otóż na kilkunastu stronach są podobne do tego przykładu "teksty" i chce je przepisać w sposób jakie pokazałem do jakiegoś pliku tekstowego aby potem eksportować to do exela aby mieć ładną tabelke :P Każda strona ma oddzielny numer (1,2,3 ect.) co też nie zauważyłem, ale to udało mi się zrobić aby podawał z klawiatury. I chciałbym aby bez potrzeby wyłączania programu mógł otworzyć plik tabela.txt przekopiować tam co chce i program zrobił od nowa i dopisał do tego pliku co chce. :D

#include <iostream>
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
   string line;
   ifstream fin("tabela.txt");
   ostringstream sout;
   int id;
   cin>>id;
   for(unsigned idp,lvl;getline(fin>>idp,line);)
     {
      istringstream sin(line);
      for(;sin.get()!=EOF;sin.clear()) sin>>lvl;
      if(!lvl) lvl=(line.back()=='-'?1:101);
      if(lvl!=101)
      {
        cout<<id<<' '<<idp<<' '<<lvl<<endl;
        sout<<id<<"; "<<idp<<"; "<<lvl<<endl;
      }
     }
   fin.close();
   ofstream fout("-tabela.txt");
   fout<<sout.str();
   fout.close();
   return 0;
  }
 
0
  1. Zdanie "... otworzyć plik tabela.txt przekopiować tam co chce i program zrobił od nowa i dopisał do tego pliku co chce" - sugeruje program czytający myśli - jak na razie nie wykonalne, ale jeżeli kwota 10 mln cię nie przeraża i możesz wypłacić 10% zaliczkę to mogę zacząć pisać ...
  2. Jeżeli nie zamierzasz sam niczego zrobić, to wyjaśnij w sposób zrozumiały co chcesz osiągnąć i podaj ile możesz zapłacić.
0

Dobra chyba zrozumiałem XD jeśli chodzi o program to mógłbyś mi podpowiedzieć jak zrobić aby dopisywał na koniec pliku? Z resztą sobie już poradze ;)

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