Zapis do pliku, nie tworzenie kolejnej linijki po zapisaniu

0

Zgadza się, ale już chyba wiem, gdzie jest pies pogrzebany. Wszystko działa, jeżeli importuje plik nie napisany przez mój program, gdyż mój program po napisaniu ostatniego wiersza w pliku zapewne przechodzi do następnej linii, nie wiem jak to zrobić, żeby nie tworzył kolejnej linii? Po prostu, żeby pozostawał w tej linii gdzie pisał ostatnio, bo powstaje o jedna wiecej.

void dopliku(UCZEN tablica[MAX], int i)
{
         fstream zapis;
         zapis.open("zapis.txt",ios::out); 
         if(zapis.good()==true)
         {
         cout<<"Otwieranie pliku powiodlo sie"<<endl;                     
         for(int k=0;k<i;k++)
         zapis<<tablica[k].imie<<" "<<tablica[k].nazwisko<<" "<<tablica[k].klasa<<" "<<tablica[k].srednia<<endl;
         zapis.close();
         cout<<"Zakonczono zapisywanie\n"<<endl;  
         }
         else cout<<"Pliku nie otwarto"<<endl;
         
 }
0

Na dobrą sprawę każdy wiersz ma się kończyć enterem. Jeżeli nie to jest to niekompletny wiersz.
Problem masz prawdopodobnie z odczytem.
jeżeli używasz plik.eof() to na 100% tam masz problem.

0
_13th_Dragon napisał(a)

Na dobrą sprawę każdy wiersz ma się kończyć enterem. Jeżeli nie to jest to niekompletny wiersz.
Problem masz prawdopodobnie z odczytem.
jeżeli używasz plik.eof() to na 100% tam masz problem.

Przeanalizuj mój program:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#define MAX 40


using namespace std;

typedef struct UCZEN
{
char imie[20];
char nazwisko[40];
char klasa[10];
float srednia;
};

void dodaj_ucznia(UCZEN tablica[MAX], int& i)
{
     
     cout<<"Podaj imie ucznia"<<endl;
     gets(tablica[i].imie);
     cout<<"Podaj nazwisko ucznia"<<endl;
     gets(tablica[i].nazwisko);
     cout<<"Podaj klase ucznia"<<endl;
     gets(tablica[i].klasa);
     cout<<"Podaj srednia ucznia"<<endl;
     cin>>tablica[i].srednia;
     i++;
     system("CLS");
     }
void dopliku(UCZEN tablica[MAX], int i)
{
         fstream zapis; 
         zapis.open("zapis.txt",ios::out); 
         if(zapis.good()==true)
         {
         cout<<"Otwieranie pliku powiodlo sie"<<endl;                     
         for(int k=0;k<i;k++)
         zapis<<tablica[k].imie<<" "<<tablica[k].nazwisko<<" "<<tablica[k].klasa<<" "<<tablica[k].srednia<<endl;
         zapis.close();
         cout<<"Zakonczono zapisywanie\n"<<endl;  
         }
         else cout<<"Pliku nie otwarto"<<endl;
         
 }     
void menu()
{
cout<<"Menu - Wybierz:\n1 - wczytaj dane uczniow z klawiatury\n3 - wczytaj dane uczniow z pliku\n4 - wyswietl dane uczniow wg nazwisk"
<<"\n5 - wyswietl dane uczniow wg imion\n6 - wyswietl dane uczniow wg srednich\n7 - wyswietl dane uczniow wg klas. "
<<"W przypadku uczniow z jednej klasy kryterium sortowania to nazwisko\n2 - zapisz dane do pliku\n0 - aby zakonczyc"<<endl;
}

void wczytaj(UCZEN tablica[MAX],int& i)
{
     fstream plik;
     int m=0;
     plik.open("dane.txt",ios::binary|ios::in); 
     if(plik.good()==true)
     {
                          while(!plik.eof())
                          {
                                  plik>>tablica[m].imie;
                                  plik>>tablica[m].nazwisko;     
                                  plik>>tablica[m].klasa;  
                                  plik>>tablica[m].srednia;
                                  m++;
                                  i++; 
                          
                                            }
                                          plik.close();  
                          }
                          else cout<<"Nie udalo sie otworzyc pliku/n";
 }

void sortuj(UCZEN tablica[MAX], int n, int odp)
{ 
     switch(odp)
     {
                case 6:
                     {
                         
                          
                                     
                         }
                                
                                break;
                default: cout<<"Error\n\n"; break;
                }
     
      
 }
void wyswietl(UCZEN tablica[MAX], int n)
{
     for(int l=0;l<n;l++)
     cout<<tablica[l].nazwisko<<" "<<tablica[l].imie<<" "<<tablica[l].klasa<<" "<<tablica[l].srednia<<endl;
     cout<<"\n\n";
 }





int main(int argc, char *argv[])
{
    int odp=10, i=0; 

    UCZEN* tablica=new UCZEN[MAX];
 

  

do
{
   
menu();    
(cin>>odp).sync();
system("CLS");
switch(odp)
{
           case 1:
                dodaj_ucznia(tablica,i); break;
           case 0:
                    {
                                       system("PAUSE");
                                       return EXIT_SUCCESS;    

                                       } 
          case 2:
               dopliku(tablica,i); break; 
          case 3:
               wczytaj(tablica,i); break;   
          case 4: 
               sortuj(tablica, i, odp); break;         
          case 5: 
               sortuj(tablica, i, odp); break;  
          case 6: 
               {
                               sortuj(tablica, i, odp);
                               wyswietl(tablica, i); break;
               }
          case 7: 
               sortuj(tablica, i, odp); break;                                                        
          default: cout<<"Zle dane\n\n"; break;                              


}


}
while(odp!=0);



system("PAUSE");
return EXIT_SUCCESS;
}
0

Czyli tak jak mówiłem masz problem z odczytem, ma być coś na kształt:

if(plik)
  {
   while(plik>>tablica[m].imie>>tablica[m].nazwisko>>tablica[m].klasa>>tablica[m].srednia) ++m;
   i=m;
  }
else cout<<"Nie udalo sie otworzyc pliku/n";
0

No nie wiem czy z odczytem, bo jak usunę ten enter w tym pliku to czyta ok, jednak użyłem twojego sposobu i rzeczywiście lepiej działa. Wielkie dzięki

0
michaldadej napisał(a)

po napisaniu ostatniego wiersza w pliku zapewne przechodzi do następnej linii, nie wiem jak to zrobić, żeby nie tworzył kolejnej linii?

To nie chodzi czasem o to, że standardowo strumień pracuje w trybie tekstowym? Jak zapisujesz pliki na dysku to '\n' jest zamieniane na '\r' '\n', a przy odczycie odwrotnie - w pliku masz '\r'+'\n' a ze strumienia wychodzi '\n'.

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