Miért hibás C++ -ban ez a beolvasás?
std::ifstream ist{"1.txt"};
while(!ist.eof())
{
char *t = new char[30];
ist >> t;
std::cout << t << " ";
delete[] t;
}
Mint írtam, inicializálni kell a tömböt, akkor 0-val tölti fel, szóval megvan a 0 végződés, azért is volt ott az üres zárójel: new char[30]();
Igaz, itt annyi hibát elkövettem, hogy nem 30, hanem 31 kellett volna, mert kell 1 + hely a 0-nak, ha előtte végig megvan a 30 karakter. Itt még lehetett volna C++11-esen "{0}"-t is írni a C++03-as "()" fill helyett.
Egy lehetséges megoldás hibakezeléssel és üres fájl vizsgálattal:
#include <iostream>
#include <fstream>
#define BLOCK_SIZE 30
int main(int argc, char *argv[]) {
std::ifstream* input;
char* buff = new char[BLOCK_SIZE];
input = new std::ifstream("1.txt", std::ios::binary | std::ios::in | std::ios::ate);
if (input->fail()) {
std::cout << "Unable to open input file!" << std::endl;
return EXIT_FAILURE;
} else if (input->tellg() > 0) {
input->seekg(std::ios::beg);
while (!input->eof()) {
input->read(buff, BLOCK_SIZE);
std::cout.write(buff, input->gcount()) << " ";
}
delete[] buff;
} else {
std::cout << "Empty file." << std::endl;
}
input->close();
delete input;
return 0;
}
Eredeti kérdésre: az első dolog, ami nem jó, az a "while(!ist.eof())", nem beolvasás előtt kéne megnézni, hogy eof van-e, hanem beolvasni, és utána ellenőrizni, hogy a _beolvasás_ sikeres volt-e.
A readdel valószínűleg jó lesz, ha eggyel kevesebbet olvasol, és a végére pakolsz egy 0-t (bár nem tudom, mi értelme van).
A foglalásos probléma az tényleg ott van, de nem kizárt, hogy ezt a fordító elintézi (a memóriafoglalás miatt nem vagyok benne biztos).
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!