Plik nie działa właściwie...?

0

w skrócie:
Visual studio community 2015,
kod:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;


int main()

{
A: system("CLS");
	cout << "Are you registered ? \n 1 - yes \n 2 - no \n";
	int a;
	cin >> a;
	if (a == 2)
	{
		cout << "What is your login? " << endl;
		cout << "My login is: \n";
		string name;
		cin >> name;
		cout << "hello " << name << endl;
		ofstream first_name("data.txt");
		first_name << name;
		first_name.close();
		cout << "your login has been saved, you can now log in." << endl;
		system("pause");
		return 0;
	}
	else if (a == 1)
	{
		fstream first_name;
		first_name.open("data.txt", ios::out);  // próbowałem też first_name.open("data.txt"); , ale z tym samym efektem.
		if (first_name.good() == false);
		{
			cout << "You are not registered!" << endl;
			system("pause");
			return 0;
		}
		string line;
		getline(first_name, line);
		first_name.close();
		cout << line << endl;
		system("pause");
		return 0;
	}
	else
		cout << "Incorrect number. Please, try again: " << endl;
	goto A;
}

Problem: za każdym razem, gdy najpierw zapiszę login z poziomu konsoli do pliku data.txt, a potem chcę go odczytać, mimo że plik istnieje, i znajduje się w Resources Files, wyskakuje mi "you are not registered!", a plik data.txt nagle staje się pusty. szczerze nie wiem gdzie leży problem. Stawiałem na lokalizację pliku.

plik .exe znajduje się w Vote/Debug, a plik .txt jest automatycznie tworzony w lokalizacji Vote/Vote, jednak po przekopiowaniu pliku .exe na pulpit, i odpaleniu go, plik .txt był w tej samej lokalizacji, jednak problem był dokładnie ten sam.

0

O ile problem (Dzięki wujkowi google) rozwiązałem zamieniając if (first_name.good()==false) na if(first_name.is_open()), jednak wciąż chciałbym się dowiedzieć, czemu tamten kod nie działa.

0

Czytam sobie włąsnie o tym http://cpp0x.pl/kursy/Kurs-C++/Obsluga-plikow/305

Kiedy nie uzyskamy dostępu do pliku
Próba odczytu:

Plik nie istnieje na dysku;
Nie posiadamy uprawnień odczytu do pliku.

Próba zapisu:

Nie posiadamy uprawnień pozwalających nam modyfikować plik;
Nie posiadamy uprawnień do katalogu w którym chcemy utworzyć plik;
Nośnik, na którym chcemy dokonać zapisu jest tylko do odczytu.
1
goto A; 

A gdzie zastosowanie pętli?

0

A problem nie lezy przypadkiem w tym?

first_name.open("data.txt", ios::out);  // próbowałem też first_name.open("data.txt"); , ale z tym samym efektem.
if (first_name.good() == false);

http://www.cplusplus.com/reference/ios/ios/good/
Jeżeli masz flagę ios::out i plik przy otwarciu sie wyczyści, to według tabelki z linku dostaniesz false, prawdopodobnie eofbit...

0

Nie sprawdzałem, ale myślę, że będzie działać

#include <iostream>
#include <string>
#include <fstream>
#include <conio.h>
#include <vector>
using namespace std;

vector <string> vLogins;
void LoadLogins(){
    fstream fFile("data.txt", ios::in);
    if(fFile.is_open())
    {
        string sBuff;
        while(!fFile.eof()){
            fFile >> sBuff;
            vLogins.push_back(sBuff);
        }
    }
    fFile.close();
}
void SaveLogins(){
    fstream fFile("data.txt", ios::out);
    if(fFile.is_open())
     for(auto &sBuff : vLogins)
      fFile << sBuff << endl;
    fFile.close();
}

int main()
{
    LoadLogins();
    int iCheck = 0;
    cout << ">>> Create account(1), Connect(2), Quit(0)";
    while(cin >> iCheck && iCheck != 0)
    {
        switch(iCheck)
        {
            case 1:{
                string sLogin;
                cout << "Write a new login: ";
                cin >> sLogin;
                auto it = vLogins.find(vLogins.begin(), vLogins.end(), sLogin);
                if(it != vLogins.end()){
                    cout << "Your new login saved succesfully!" << endl;
                    vLogins.push_back(sLogin);
                }
                else cout << sLogin << " already exist!" << endl;
                break;
            }
            case 2:{
                string sLogin;
                cout << "login: ";
                cin >> sLogin;
                auto it = find(vLogins.begin(), vLogins.end(), sLogin);
                if(it != vLogins.end()) cout << "CONNECT !" << endl;
                else cout << sLogin << "WRONG LOGIN !" << endl;
                break;
            }
            default:
                return 0;
        }
        cout << ">>> Stworz login (1), zaloguj sie (2), zakoncz (0)";
    }
}
 
0
gswidwa napisał(a):

Czytam sobie włąsnie o tym http://cpp0x.pl/kursy/Kurs-C++/Obsluga-plikow/305

Kiedy nie uzyskamy dostępu do pliku
Próba odczytu:

Plik nie istnieje na dysku;
Nie posiadamy uprawnień odczytu do pliku.

Próba zapisu:

Nie posiadamy uprawnień pozwalających nam modyfikować plik;
Nie posiadamy uprawnień do katalogu w którym chcemy utworzyć plik;
Nośnik, na którym chcemy dokonać zapisu jest tylko do odczytu.

Przy zapisie: wszystko działa.
Przy odczycie: Plik istnieje na dysku, został stworzony przez ten właśnie program,
Mam uprawnienia do odczytu pliku, Dowód: wszystko działa, jak napisałem pod swoim pierwszym postem, ale wciąż nie wiem, czemu tamten kod nie działa.

carlosmay napisał(a):
goto A; 

A gdzie zastosowanie pętli?

w tym wypadku, jest to raczej projekt, i posłużyłem się goto, ponieważ kod ma <100 linijek, => jest prostsze i wygodniejsze.

gswidwa napisał(a):

A problem nie lezy przypadkiem w tym?

first_name.open("data.txt", ios::out);  // próbowałem też first_name.open("data.txt"); , ale z tym samym efektem.
if (first_name.good() == false);

http://www.cplusplus.com/reference/ios/ios/good/
Jeżeli masz flagę ios::out i plik przy otwarciu sie wyczyści, to według tabelki z linku dostaniesz false, prawdopodobnie eofbit...

Nie, ponieważ wycięcie ios::out nic nie dawało, próbowałem

Co do ostatniego postu z kodem: nie działa. błędy:

"1>------ Build started: Project: test, Configuration: Debug Win32 ------
1> test.cpp
1>c:\users\antek\desktop\test\test\test\test.cpp(46): error C2039: 'find': is not a member of 'std::vector<std::string,std::allocator<_Ty>>'
1> with
1> [
1> _Ty=std::string
1> ]
1> c:\users\antek\desktop\test\test\test\test.cpp(12): note: see declaration of 'std::vector<std::string,std::allocator<_Ty>>'
1> with
1> [
1> _Ty=std::string
1> ]
1>c:\users\antek\desktop\test\test\test\test.cpp(47): error C3536: 'it': cannot be used before it is initialized
1>c:\users\antek\desktop\test\test\test\test.cpp(47): error C2678: binary '!=': no operator found which takes a left-hand operand of type 'int' (or there is no acceptable conversion)
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\system_error(419): note: could be 'bool std::operator !=(const std::error_condition &,const std::error_condition &) noexcept'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\system_error(412): note: or 'bool std::operator !=(const std::error_condition &,const std::error_code &) noexcept'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\system_error(405): note: or 'bool std::operator !=(const std::error_code &,const std::error_condition &) noexcept'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\system_error(398): note: or 'bool std::operator !=(const std::error_code &,const std::error_code &) noexcept'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\exception(354): note: or 'bool std::operator !=(const std::exception_ptr &,std::nullptr_t) throw()'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\exception(349): note: or 'bool std::operator !=(std::nullptr_t,const std::exception_ptr &) throw()'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\exception(344): note: or 'bool std::operator !=(const std::exception_ptr &,const std::exception_ptr &) throw()'
1> c:\users\antek\desktop\test\test\test\test.cpp(47): note: while trying to match the argument list '(int, std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped =========="

0

std::vector<> nie ma zdefiniowanej metody *.find(). (pierwszy z brzegu błąd).
Należy użyć funkcji std::find() zdefiniowanej w pliku nagłówkowym <algorithm>.

0
if (first_name.good() == false);
         

Średnik za ifem powoduje, że instrukcja jest pusta.
Poza tym, gdy plik jest OK metoda *.good() zwraca true.
W podanym linku powinny być takie info ( ew. w odnośnikach).

Zamiast metody good() można użyć nazwa_pliku.is_open() lub po prostu if(nazwa_pliku).

0

Ahaaaa...
Dobra, teraz wszystko działa, dzięki wielkie :D

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