C++ mérete .txt fájlnak

C++ mérete .txt fájlnak
2018-05-14T01:15:04+02:00
2018-05-18T14:57:58+02:00
2022-10-15T21:41:41+02:00
TiviHUN
Sziasztok! A feladat az hogy, parancssori paraméterként el kell dönteni hogy a fájl létezik-e. Ha nincs ilyen, akkor létre kell hozni, viszont ha van, akkor ki kell íratni a méretét a kimenetre, kB-ban. A megjelenítést 2 tizedesjegy pontossággal kell elvégezni.
Hogyan tudom megvalósítani, hogy megállapítom a fájl méretét, illetve ezt kiíratom?
Válaszokat előre is köszi!

#include <iostream> #include <string> #include <fstream> using namespace std; int main() { cout << "Add meg a fajl nevet:"; string fullfile; cin >> fullfile; ifstream fin(fullfile); if (!fin) { cerr << "Nem talalhato " << fullfile <<" nevu fajl." <<endl; } else if (fin) { cout << "A fajl megtalalhato!" << endl; } return 0; }
Mutasd a teljes hozzászólást!
#include <sys/stat.h> // @return: fájl méret, vagy 0, ha nem létezik size_t getFilesize(const std::string& filename) { struct stat st; if(stat(filename.c_str(), &st) != 0) { return 0; } return st.st_size; }
Mutasd a teljes hozzászólást!

  • Hogy és hol próbáltál rákeresni? :)
    Ha nem akarod kigooglezni, a kész megoldást, akkor annyit segítek, hogy itt mindent megtalálsz, ami a feladat megoldásához szükséges!

    std::ifstream
    Mutasd a teljes hozzászólást!
  • A 'stat' és a 'printf' kell csak hozzá. Részletek a helpben.
    Mutasd a teljes hozzászólást!
  • #include <sys/stat.h> // @return: fájl méret, vagy 0, ha nem létezik size_t getFilesize(const std::string& filename) { struct stat st; if(stat(filename.c_str(), &st) != 0) { return 0; } return st.st_size; }
    Mutasd a teljes hozzászólást!
  • Köszi! És ha itt az értéket kiszeretném írni, akkor a "st.st_size" -csak cout -al kiíratom? Illetve ezt a main függvénnyel össze tudnám fűzni? Mert a cél ugye, hogy inputról adom meg a fájl nevét, és arról döntöm el hogy mekkora a mérete. Szóval ez az érték lehet mindig más.
    Mutasd a teljes hozzászólást!
  • Köszi! Ez számomra sajnos még annyira nem átlátható, értelmezhető hogy értékes infót szedjek ki belőle. Idővel remélem ez változni fog. Próbáltam egy alternatív megoldást magamtól is, de az sajnos nem működött.
    Mutasd a teljes hozzászólást!
  • Annyi az egész, hogy megnyitod a fájlt. Megnyitáskor átadod a ios_base::binary és ios_base::ate opciókat.
    Így bináris módon megnyitja a fájlt és a végére megy (lsd dokumentáció). Vagy kézzel a végére mész a 'seekg' függvény segítségével.
    Ha már a végén vagy, akkor meghívod a 'tellg' függvényt, mely megmondja az aktuális pozíciódat a fájlon belül. (Mivel a végén vagy, a fájl méretét adja vissza.)
    Ez igazából 2 sor.

    A többiek válaszát nem értem. Nem szabvány C++ kód, amiket javasolnak neked. Persze jó megoldás, de ha a nyelvet tanulod, akkor a szabvány dolgokat kéne használni és nem összemosni, hogy mi van a nyelv szabványában és mi jön Posix/Windows API-ból.. Azok már platformfüggő dolgok..

    Ha már nem szabványt használunk, akkor a boost::filesystem használatát javasolnám:
    Filesystem Home
    boost::filesystem::file_size
    Mutasd a teljes hozzászólást!
  • Ha már nem szabványt használunk, akkor a boost::filesystem használatát javasolnám:

    Ha esetleg mégis szabványt használunk, én a std::filesystem használatát javasolnám:
    Filesystem library - cppreference.com
    Mutasd a teljes hozzászólást!
  • Igen C++17.. Írhattam volna. Én még nem használom ezt a szabványt. Úgy tudom, hogy a GCC 8-as legújabb verziója talán már minden feature-t támogat, viszont még experimental úgy tudom. Viszont pl egy VisualStudio-val szeirntem esélye nincs rá, hogy jelenleg támogatnák..

    De igen fontos megjegyezni, hogy a C++ fejlődik és bizony a C++17 már tudja az std::filesystem-et (ami amúgy kb 99%-ban megegyezik a boost::filesystem-el)
    Mutasd a teljes hozzászólást!
  • Köszi! Annyiban még tudnál segíteni, hogy például ha  C:\temp helyen van egy .txt fájl, nem a gyökérkonyvtárban..akkor azt hogyan tudom beolvasni?
    Mutasd a teljes hozzászólást!
  • Azt adod meg a fájl elérési útjának :)

    ifstream ifs("C:/temp.txt") ifstream ifs("C:\\temp.txt") ifstream ifs( R"(C:\temp.txt)")
    Mutasd a teljes hozzászólást!
  • Oh, köszönöm! Azt gondoltam ez komplikáltabb, de akkor mégsem. :)
    Mutasd a teljes hozzászólást!
  • Miért nem próbáltad ki? Hibaüzeneteket is tudni kell értelmezni..
    Abból tanulsz, ha kicsit szenvedsz vele és önállóan megoldod a problémákat!

    Akkor kérdezz, ha próbáltad és legalább 20 perce nem tudtad működésre bírni és nem is érted, hogy mi a baja..
    Mutasd a teljes hozzászólást!
  • Nem is annyira a szabvánnyal van a gond, hanem azzal, hogy a fájl méretét esetleg akkor is megmondhatod, ha a fájl megnyitásához nincs is jogod... azon kívül a megnyitás+pozícionálás sokkal erőforrásigényesebb is, mint a stat(2)
    Mutasd a teljes hozzászólást!
  • Szerintem nyelv tanulása során fölösleges ilyesmiről beszélni. Ismerje meg a standard által nyújtott lehetőségeket és interfészeket, aztán ha érdekli/szüksége van rá, akkor elmegy abba az irányba, amire szüksége van.
    Posix/Win32Api, stb..

    Ha nem szabvány megoldás, akkor pedig személy szerint én a boost-ot javasolnám neki, nem a winapi/posix api használatát.
    Amúgy igazad van, a szabvány C++-nak megvannak a maga korlátai, ezekkel is jó tisztába lenni.
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséget!!

    #include <iostream> #include <string> #include <fstream> using namespace std; int main() { string line; cout << "Add meg a fajl nevet:"; string fullfile; cin >> fullfile; ifstream fin(fullfile); if (!fin) { cerr << "Nem talalhato " << fullfile << " nevu fajl." << endl; } else if (fin) { cout << "A fajl megtalalhato!" << endl; if (fin.is_open()) { ios_base::binary; ios_base::ate; cout << fin.tellg(); } } return 0; }


    A tellg így valamiért 0-át ad vissza, pedig a fájlban egész vannak karakterek. Rosszul hívtam meg?
    Mutasd a teljes hozzászólást!
  • Használd az oldalt, amit már többször linkeltem!
    std::ios_base::openmode - cppreference.com

    A 'See also' szekció mutatja, hogy hol referálnak rá..
    Mutasd a teljes hozzászólást!
  • Igen, próbálom, csak nem igazán találom meg benne hogy pontosan hogy is kellene paraméterezni ezt/ezeket.

    ios_base::binary; ios_base::ate; cout << fin.tellg();
    Azért köszönöm a segítséget. Remélem jutok valamire. :)
    Mutasd a teljes hozzászólást!
  • Off: jól saccolom, hogy kb január óta nem csináltál házifeladatot, azért kell most mindent egyszerre beadnod?
    Mutasd a teljes hozzászólást!
  • Eddig fájlméret meghatározására ezt használtam:

    #include <sys/stat.h> struct stat st; stat("filename", &st); int size; size = st.st_size; cout << size;
    De most inputról szeretnék bekérni, és nem nagyon jön össze..
    (Sajnos a fájlkezelésig még el sem jutottunk az órán, de kérik vissza. C#-ot tanultam eddig, ott kicsit könnyebnek tűntek a dolgok.)

    Egyébként köszönök még egyszer minden segítséget! És bocsi, ha ilyen magától értetődő dolgokat kérdezek.
    Mutasd a teljes hozzászólást!
  • De most inputról szeretnék bekérni, és nem nagyon jön össze..

    Bontsd részfeladatokra. Ezek közül mi nem megy?

    1. string beolvasása és kiiratása a kimenetre
    2. string változó által meghatározott fájl megnyitása.
    3. string beolvasása és a beolvasott string-el megnyitni a fájlt.
    Mutasd a teljes hozzászólást!
  • A beolvasott stringgel megnyitni a fájlt, pontosabban a fordító nem tud lefordulni.

    #include <iostream> #include <string> #include <fstream> #include <sys/stat.h> using namespace std; int main() { string filename; cin >> filename; struct stat st; stat(filename, &st); int size; size = st.st_size; cout << size; return 0; }
    stat(filename, &st);
    részben a filename -t pirossal aláhúzza, azzal a hibakiírással hogy Error: no suitable conversion function from "std::string" to "const char *" exists.

    Gondolom ez abból ered hogy előre meghatározott konstans értéket vehet csak fel. Szóval próbáltam más oldalról megközelíteni a dolgot,de nem jutottam egyről a kettőre, ezért írtam ki a kérdést..És minden eddigi segítséget köszönök is.
    Mutasd a teljes hozzászólást!
  • Hát a topic elején ott van helyesen. Milyen más segítség kell? Copy+paste -től nincs egyszerűbb.
    Ha meg érteni is akarod, akkor sajnos ezt meg kell tudnod oldani: megvan a rossz minta, megvan a jó minta, van értelmes hibaüzeneted, van help/manual is.
    Ennyivel vagy megy, vagy add fel.
    Mutasd a teljes hozzászólást!
  • Azzal a módszerrel sikerült már ,de én külön függvény nélkül gondoltam. (magában a main-ben megoldani)
    std::ios_base::openmode - cppreference.com
    erre vagyok kíváncsi igazán, amit **G** javasolt.
    Persze az elsőnek is köszi a segítséget!
    Mutasd a teljes hozzászólást!
  • Error: no suitable conversion function from "std::string" to "const char *" exists.

    Magyar nyelvre fordítva: "Kutyából nem lesz szalonna" kivéve ha Kínában vagy. C++ nyelven ez annyit tesz, hogy filename.c_str().
    Mutasd a teljes hozzászólást!
  • Pont par napja jelentettek be azt a VS verziot ami full c++17 kompatibilis.

    Amugy meg a boost haszalatat el kene felejteni lassan. Ott van a bovitett stl, egy hatalmas konyvtarat cipelni magaddal mindenfele borzalmas otlet. Annal meg a winapi/posix hasznalata is esszerubb. (ilyet pl trivialis megirni)
    Mutasd a teljes hozzászólást!
  • Amugy meg a boost haszalatat el kene felejteni lassan. Ott van a bovitett stl, egy hatalmas konyvtarat cipelni magaddal mindenfele borzalmas otlet.


    Off-topik, de ezzel nem értek teljesen egyet.
    Egy 'file_size' miatt nyilvánvalóan nem éri meg behúzni egy boost függőséget, viszont C++17 előtt elég sok hasznos apróságot tud a boost, amit a standard nem. (optional, filesystem, any) Sőt nagyon sok hasznos funkcionalitás még C++17-ben sem elérhető (ranges/adaptors, asio, lexical_cast), stb..

    Nem beszélve egyéb hasznos könyvtárakról program options, property_tree, Locale (egyszerű ICU backend), multiprecision, stb..

    Tehát a C++ elég sokat felzárkózott és nagyon sok esetben elavultá/fölöslegessé tette a boost használatát, kezdve a C++11-es standardtől, viszont még mindig nagyon messze vagyunk attól, hogy a boost könyvtárak által nyújtott lehetőségeket leírjuk.. Nem beszélve az olyan könyvtárakról, amiknek szerintem nincs helye a C++-ban.

    (Szerintem a C++-nak meg kéne maradnia a core dolgoknál és nem bele vinni a nyelv szabványába pl egy xml parsert.. A core nyelvi dolgokon is bőven van mit fejleszteni, a többit meg majd megoldják a külső könyvtárak.)
    Mutasd a teljes hozzászólást!
  • Viszont pl egy VisualStudio-val szeirntem esélye nincs rá, hogy jelenleg támogatnák..

    De.
    Mutasd a teljes hozzászólást!
  • Sőt nagyon sok hasznos funkcionalitás még C++17-ben sem elérhető (ranges/adaptors, asio, lexical_cast), stb..

    ASIO ... na az minek egy C++ szabványba?

    A C++ szabványba olyan algoritmusok legyenek, amik függetlenek tudnak lenni az adott hype-októl.

    (Szerintem a C++-nak meg kéne maradnia a core dolgoknál és nem bele vinni a nyelv szabványába pl egy xml parsert.. A core nyelvi dolgokon is bőven van mit fejleszteni, a többit meg majd megoldják a külső könyvtárak.)

    Szerintem meg pont jó lenne, ha nem a bloat Boost lenne a válasz minden kérdésre.

    Meg akkor minek a C++? a class kulcsszó miatt? a többi menjen Boost-ba?
    Mutasd a teljes hozzászólást!
  • ASIO ... na az minek egy C++ szabványba?

    A networking-el, threading-el, meg ilyenekkel egyetértek. Ezeket és a nyelvi featuröket (lambda, concepts, modules, Reflection) értem core alatt.

    Viszont ha megnézed, hogy miket terveznek, 2D grafika!!!, olvastam már olyanról, hogy ilyen olyan parsereket is bele akarnak rakni. Szerintem ezek teljesen fölöslegesek. Nem örülnék neki, ha a C++-is kapna egy .NET infrastruktúrát maga köré.
    Már csak azért sem, mert nincs egyetlen nagy cég, ami mögötte áll, így a független fordító készítőknek, C++ committee tagoknak kár ilyesmire pocsékolniuk az erőforrásaikat.
    Most komolyan mennyire lenne a nyelv hasznára egy std::XmlParser, vagy hogy Pistikének sikerélménye legyen, hogy kirajzolt 2 kört az std::circle-el..
    Vagy most az opengl-el, opencv-vel, tensorflow, Qt-vel, SDL-el stb könyvtárak funkcionalitásával akar versenyezni a C++ szabvány?

    Szerintem meg pont jó lenne, ha nem a bloat Boost lenne a válasz minden kérdésre.

    A boost-al eléggé kompatibilis szokott lenni, ami bekerül az új standarekbe, de amúgy nem is a Boost-on van a lényeg, az csak egy sok lehetőség közül, nem a szentírás. Lsd a teljesség igénye nélkül felsorolt néhány igen népszerű könyvtár az előző bekezdés végén..
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd