Permalänk

C++ getline() under fstream

Hur kan jag läsa en given rad från en fil?

ungefär såhär:

#include <fstream> #include <string.h> using namespace std; void main() { ifstream fil(filnamn.txt); string STRING; //kolla om filen finns... while (!fil.eof()) { getline(BUFFER, ROW, STRING); /* där BUFFER kan vara fil eller cin exempelvis, RADNUMMER är antalet \n - 1 som ska hoppasöver innan man läser, STRING är strängen eller ja, variabeln man läser till... behöver man verkligen !file.eof() då? jag menar, jag väljer ju vilken rad jag ska läsa... jaja, ni förstår vad jag menar iaf. */ cout << STRING; } }

är inte så inne på fstream så om något mer än detta tillläggs så förklara gärna syntaxerna mm.

Tack på förhand
Neckutrek

Permalänk
Medlem

Jag kan inte syntaxen heller, men om du läser en specifik rad så ska du ju inte ha en loop att läsa den i, då blir ju loopen oändlig.

Visa signatur

Fame's a bitch, man

Permalänk

okej, nej det är ju sant.. då läser jag den ju allt för många gånger

men iaf. kan man inte loopa cin.ignore() flera gånger eller något? då kan man ju göra en funktion som gör alltihop..:P någon som kan syntaxerna för istream::ignore() istream::getline() och istream::get()?

EDIT:

Jag vill läsa "glosor" till strängarna swe_word[] och eng_word[]...

int init_words() { ifstream file("words.txt"); if (!file) { cout << "The file words.txt could not be found!\n"; system("pause"); return 0; } for (word_index = 0; !file.eof(); word_index++) { file.getline(swe_word[word_index], '\n', '-'); file.getline(eng_word[word_index], '\n', '-'); } return 1; }

men jag får felmeddelandet:
"could not find a match för 'istream::getline(string, char, char)' in function init_words()"
Vad innebär detta? Syntaxen för istream::getline() är väl:

Citat:

getline
Syntax:

istream &getline( char *buffer, streamsize num );
istream &getline( char *buffer, streamsize num, char delim );

The getline() function is used with input streams, and reads characters into buffer until either:

* num - 1 characters have been read,
* a newline is encountered,
* an EOF is encountered,
* or, optionally, until the character delim is read. The delim character is not put into buffer.

Vad gör jag för fel?

Permalänk
Medlem

Ett sätt är att göra såhär:

#include <fstream> #include <iostream> using namespace std; #define MAX_LENGTH 50 int main() { ifstream fil("filnamn.txt"); char buffer[MAX_LENGTH]; //kolla om filen finns... while ( !fil.eof() ) { fil.getline(buffer, MAX_LENGTH); cout << buffer << endl; } return 0; }

Det första argumentet är strängen av typ char[] som ska innehålla raden. Det andra argumentet är hur många tecken som ska läsas in (om nu inte raden är slut innan dess. Man kan även ha ett tredje argument som stoppar inläsningen om ett visst tecken (av typen char) hittas.

Eftersom det första argument måste vara av typen char[] så kan du inte skriva

string mystring; fil.getline(mystring, MAX_LENGTH);

, utan du får först lägga inmatningen i en temporär char[]-variabel.

Visa signatur

Credo certe ne cras

Permalänk
Medlem

...men däremot 'std::getline(fil, mystring);'

Visa signatur

Perl - Made by Idiots, Java - Made for Idiots, C++ - Envied by Idiots

Permalänk
Medlem

Hej. Nedan är ett komplett exempel på inläsning från fil med " - " som separerar varje svenska och engelska ord.

Och det finns både en std::getline och end ifstream::getline (istream) och de två har lite olika syntax.

#include <string> #include <fstream> #include <iostream> /* filen words.txt är formaterad som: svenskt ord 1 - engelskt ord 2 svenskt ord 2 - engelskt ord 3 */ int main() { std::ifstream stream ( "words.txt" ); std::string line; while ( std::getline ( stream, line, '\n' ) ) { size_t n = line.find ( '-', 0 ); std::string swe = line.substr ( 0, n ); std::string eng = line.substr ( n + 2, line.length() - ( n + 1 ) ); std::cout << swe << std::endl << eng << std::endl; } return 0; }

Permalänk
Medlem

Du kan använda getline i en loop och köra loopen det antal rader du vill hoppa över.

Permalänk

Tack Zoomster! Det funkade!