Fstream, zapis, linux

0

Witam. Piszę swój pierwszy kod pod linuxem i nie wiem co jest tu źle zrobione, na windowsie wszystko działa.
Kod:

class Klasa
{
public:
   std::fstream Plik;

   void Funkcja()
   {
      this->Plik.open("Plik.txt", std::ios::app);
      this->Plik << "Tekst";
      this->Plik.close();
   }

   void Funkcja2()
   {
      Funkcja();
   }
}
0

Zapomniałem dopisać że program się kompiluje, niestety niczego nie wpisuje do pliku. Gdy chcę coś odczytać wszystko działa. Prawa pliku są dobrze przypisane.

0

Może nie masz uprawnień do zapisu?
Sprawdź czy zmienna Plik ma poprawny stan:
if(Plik){ /*...*/ }else{ /*...*/ }

0

Uprawnienia mam, zwraca true :/

1

Powinno działać.
Kod, który zamieściłeś nie jest kompletny, pokaż wszystko co tam masz:)
To jest IO kolego i efekty mocno zależą od aktualnego stanu systemu operacyjnego, może wrzuć jeszcze output z strace-a na deser:

strace -v -e trace=open,stat,chmod,unlink,write,read,close ./twoja_binarka
0

@yurai
Całego kodu nie ma co pokazywać bo zrobiłem nowy program z tym co jest w temacie + mainem z wywołaniem i też nie działa

$ strace -v -e trace=open,stat,chmod,unlink,write,read,close ./Source       
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
open("/usr/lib/x86_64-linux-gnu/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \266\5\0\0\0\0\0"..., 832) = 832
close(3)                                = 0
open("/lib/x86_64-linux-gnu/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260*\0\0\0\0\0\0"..., 832) = 832
close(3)                                = 0
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\37\2\0\0\0\0\0"..., 832) = 832
close(3)                                = 0
open("/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20V\0\0\0\0\0\0"..., 832) = 832
close(3)                                = 0
 
0

Jeśli to jest rzeczywiście cały output z strace-a to oznacza, że Funkcja się nie wykonuje - sterowanie nie wchodzi tam w ogóle i nie jest wołany ani open ani operator<< ani close. To co pokazuje strace w tym momencie to tylko system call-e we/wy ładujące biblioteki przez kod loadera dynamicznego (przed wejściem do main-a) i nic więcej.
Strzelam że przez przypadek zakomentowałeś wywołanie interesujacego nas fragmentu. Dla pewności sprawdź pod debugger-em. Nie lepiej było po prostu wrzucić od razu wszystko razem z main-em()?

0
#include <iostream>
#include <fstream>

class Klasa
{
public:
   std::fstream Plik;

   void Funkcja()
   {
      this->Plik.open("Plik.txt", std::ios::app);
      this->Plik << "Tekst";
      this->Plik.close();
   }

   void Funkcja2()
   {
      Funkcja();
   }
};

int main(){
    Klasa *plik = new Klasa;
    plik -> Funkcja2();
    delete plik;

    return 0;
}

Kod działa poprawnie, to coś po stronie systemu, więc pewnie jednak nie masz praw do zapisu, sprawdź to dokładnie.

0

pytanie jest jaka jest aktywna ścieżka?
Bo jeśli jest to jakaś systemowa ścieżka, no to pewnie nie może utworzyć pliku z powodu braku uprawnień.
Może najpierw spróbuj z pełną ścieżką.

0

Pytanie czy uruchamiasz to z poziomu IDE czy z palucha z konsoli? Jeżeli uruchamiasz to poprzez debug/build z poziomu IDE to program może szukać tego pliku zupełnie gdzie indziej niż Ci się wydaje. :) Jeżeli tak się okażę to zawsze możesz sobie zrobić ~/plik.txt i będziesz miał pewność, że plik zawsze obsługiwany będzie w Twoim katalogu home.

Kiedyś w VS miałem taki problem jak uruchamiałem IDE z poziomu zwykłego użytkownika. System robił operacje IO w %systemroot%\system32'\..., bo taką miał bezwzględną ścieżkę wstawianą przez IDE i za nic nie mogłem poprawnie zapisywać do pliku różnych rzeczy. ;) O dziwno przy jakiejś tam kolejnej instalacji Windowsa i VS problem nie powrócił hehe.

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