[C++] Wczytywanie z pliku oraz string

Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Wczytywanie z pliku oraz string

Post autor: mortan517 »

Witam, mam pytanie co do odczytywania pliku z stringiem. Przy zwykłej tablicy char program działa, ale z użyciem string wyrzuca błąd. Ktoś wie jak sobie z tym poradzić?

Kod: Zaznacz cały

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

int main(void)
{
     ifstream inFile;
     string filename;
     getline(cin, filename);
     inFile.open(filename);
     ...
     inFile.close();
     return 0;
}
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Wczytywanie z pliku oraz string

Post autor: Afish »

Jaki błąd?
Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Wczytywanie z pliku oraz string

Post autor: mortan517 »

Kod: Zaznacz cały

			C:\Users\Mortan\Desktop\test.cpp	In function 'int main()':
11	22	C:\Users\Mortan\Desktop\test.cpp	[Error] no matching function for call to 'std::basic_ifstream<char>::open(std::string&)'
11	22	C:\Users\Mortan\Desktop\test.cpp	[Note] candidate is:
3	0	C:\Users\Mortan\Desktop\test.cpp	In file included from C:\Users\Mortan\Desktop\test.cpp
538	7	c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\fstream	[Note] void std::basic_ifstream<_CharT, _Traits>::open(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::ios_base::openmode = std::_Ios_Openmode]
538	7	c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\fstream	[Note] no known conversion for argument 1 from 'std::string {aka std::basic_string<char>}' to 'const char*'
Aterwik
Użytkownik
Użytkownik
Posty: 16
Rejestracja: 15 kwie 2015, o 19:08
Płeć: Mężczyzna
Lokalizacja: Kujawsko-Pomorskie
Podziękował: 3 razy
Pomógł: 4 razy

[C++] Wczytywanie z pliku oraz string

Post autor: Aterwik »

Problem leży w 11. linijce kodu:

Kod: Zaznacz cały

inFile.open(filename);
W

Kod: Zaznacz cały

http://www.cplusplus.com/reference/fstream/ifstream/open/
możesz znaleźć jej dwa prototypy:

Kod: Zaznacz cały

void open (const char* filename,  ios_base::openmode mode = ios_base::in);
void open (const string& filename,  ios_base::openmode mode = ios_base::in);
Z czego ten drugi, pozwalający przekazać nazwę pliku jako string, istnieje tylko w standardzie C++11, którego twój kompilator najwyraźniej nie obsługuje, więc musisz skorzystać z tego pierwszego.
Wynika z tego, że (jeśli twój kompilator nie obsługuje C++11) pierwszy argument metody musi być typu const char*, czyli musi być tablicą char-ów. Ty natomiast próbujesz przekazać tam obiekt typu std::string, co powoduje błąd kompilacji. Możesz ten problem rozwiązać tak :

Kod: Zaznacz cały

inFile.open(filename.c_str());
(Metoda

Kod: Zaznacz cały

http://www.cplusplus.com/reference/string/string/c_str/
pozwala "przekonwertować" stringa na tablicę char-ów.), ale ja radziłbym ci zainstalować jakiś nowszy kompilator, np. [url=https://www.visualstudio.com/downloads/download-visual-studio-vs]Visual Studio 2015 Community[/url], żebyś mógł się nauczyć "nowoczesnego" C++ .
Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Wczytywanie z pliku oraz string

Post autor: mortan517 »

Wielkie dzięki, o to mi chodziło.
liu
Użytkownik
Użytkownik
Posty: 1330
Rejestracja: 10 paź 2004, o 13:30
Płeć: Mężczyzna
Lokalizacja: Suchedniów
Pomógł: 104 razy

[C++] Wczytywanie z pliku oraz string

Post autor: liu »

No już bez przesady z tą "instalacją nowszego kompilatora", to jest GCC 4.8.1, obsługuje praktycznie całe C++ 11, wystarczy dodać -std=c++11 w linii poleceń, albo jeśli używasz IDE to zmienić to w ustawieniach projektu.
ODPOWIEDZ