Problem z fstream (ifstream nie tworzy pliku)

0

kompilator: mingw
system: Windows 10

Z góry mówię że folder z projektem mam na SSD'ku na którym jest system ale na innej partycji. std::open nie tworzy ani nie edytuje pliku. Dopiero coś takiego zadziałało:

HANDLE file{};

    file = CreateFileA(ouput_fname.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_NEW, 0, nullptr);
    if (file == INVALID_HANDLE_VALUE)
    {
        DWORD err = GetLastError();
        std::cout << "CreateFile Failed\n";
        std::cout << "Error" << err << "\n";
    }
    else
    {
        std::cout << "File Created\n";
        CloseHandle(file);
        file = nullptr;
    }

Jestem laikiem w programowaniu więc proszę o łopatologiczne wyjaśnienia. Potrzebuje to zrobić tak żeby działało "normalnie" coś na tej zasadzie:

plik.open(ouput_fname.c_str(),ios::out);

To natomiast:

if(plik.good()==false)
  {
    char buffer[512]{};
    strerror_s(buffer, 512, errno);
    std::cout << buffer << '\n';
    return -1;
  }

nie wyświetla żadnego błędu.

1

std::fstream nie ustawia systemowego errno. Jeżeli good() zwraca false to możesz sprawdzić trzy flagi - bad, eof, fail. Za co odpowiadają i możliwe kombinacje znajdziesz w dokumentacji.

0

@several: ogólnie to nic mi to nie mówi jakbyś mógł mi napisać co mam wlkeić do programu żeby to sprawdzić

0

A pokaż jak ścieżka wygląda? Spacje, escape'owanie (back)slashy, relatywna/bezwględna? Na początek ustaw jakąś absolutną gdzie na 100% masz prawa zapisu.
EDIT: nie daję głowy, ale czy plik przypadkiem nie utworzy się przy pierwszym zapisie/flushu pliku? Nie pamiętam co standard mówi ale chyba nie musi od razu.

0

@alagner: taka jest ścieżka do projeku: Z:\Szkoła\Projekt algorytm RLE i z tego co rozumiem jeśli w cmd podaję samą nazwę pliku (plik.txt) to powinno się utworzyć w folderze: Projekt algorytm RLE
Testowałem ze ścieżką C:\Users\Tomek\Desktop i D:\Tomek Szkoła i nie tworzy pliku

0

Ale masz świadomość, że w stringu powinno być albo C:\\costam\\costam2 (podwójny backslash, tzn. \\) albo C:/costam/costam2? (nie wiem jak będą obsługiwane spacje, na poczatek popróbowałbym bez).

0

@alagner: nie wiem jak się robi to wyróżnienie ale ani 2x \ ani / nie działa

1

A próbowałeś do tego pliku pisać? Bo może utworzenie nastąpi w momencie opróżnienia buforów?

    std::ofstream f("c:\\alagner\\log.txt");
    if(f) {
     std::cout << "plik ok\n";
     f << "test abcd\n"; 
    }

EDIT: i pytanie: czy f.good() zwraca true, czy false, tzn. czy widzisz loga "plik ok"?

0

@alagner:

cout<<"Podaj nazwe pliku wyjsciowego: ";
  string ouput_fname;
  cin>>ouput_fname;
  plik.open(ouput_fname.c_str(),ios::out);
  plik << "something";
  plik << flush;

no ten twój kod zadziałał. wyskoczyło plik ok i utworzyło log.txt

1

No i pięknie;P
BTW, nie musisz openować osobno, zrobienie tego w konstruktorze działa tak samo dobrze.

0

czego to mi działa

fstream plik;
//...
plik.open(input_fname.c_str(),ios::in);

a to już nie

//...
  plik.open(ouput_fname.c_str(),ios::out);

i dopiero to mi działa

//...
ofstream f(ouput_fname);

czy te dwie ostatnie komendy to nie jest to samo ?

0
#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <windows.h>

using namespace std;

int main()
{
  string msg;
  fstream plik;
  cout<<"Podaj nazwe pliku wejsciowego: ";
  string input_fname;
  cin>>input_fname;
  plik.open(input_fname.c_str(),ios::in);
  if(plik.good()==false)
  {
    cout<<"Nie mozna otworzyc pliku \"" <<input_fname<<"\"";
    return -1;
  }
  cout<<"\nTwoja wiadomosc: ";
  cout<<plik.rdbuf();

  cout<<"Podaj nazwe pliku wyjsciowego: ";
  string ouput_fname;
  cin>>ouput_fname;
  cout<<ouput_fname<<endl;

  //ofstream f("c:\\log.txt");
  //  if(f) {
  //   cout << "plik ok\n";
  //   f << "test abcd\n";
  //  }
  plik.open(ouput_fname.c_str(),ios::out);
  plik << "something";
  plik << flush;

  //ifstream file(ouput_fname);
  //if(plik.good()==false)
  //{
  //  char buffer[512]{};
  //  strerror_s(buffer, 512, errno);
  //  std::cout << buffer << '\n';
  //  return -1;
  //}
//  HANDLE file{};
//
//    file = CreateFileA(ouput_fname.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_NEW, 0, nullptr);
//    if (file == INVALID_HANDLE_VALUE)
//    {
//        DWORD err = GetLastError();
//        std::cout << "CreateFile Failed\n";
//        std::cout << "Error" << err << "\n";
//    }
//    else
//    {
//        std::cout << "File Created\n";
//        CloseHandle(file);
//        file = nullptr;
//    }
  return 0;
}

0

plik.open(ouput_fname.c_str(),ios::out); jeżeli problem jest tu, to If the stream is already associated with a file (i.e., it is already open), calling this function fails..
Otwórz nowy stream albo zamknij stary.

0

dzięki działa

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