c ++ файлды массивке қалай оқуға болады


жауап 1:

C ++ файлдарға қол жеткізу үшін C стандартты енгізу-шығару жүйесін қолданады. Сонымен, C коды өте жақсы жұмыс істейді.

C ++ тілінде көптеген иострим нысандары бар, олар осылайша көптеген жақсы нәрселер жасайды.

Бұл файлдың пішімін білуге ​​көмектеседі. Сіз үтірлермен бөлінген сандарды, бос орын бөлінгенін немесе бір жолға бір оқып отырсыз ба?

Дұрыс айтасыз, олар сандар емес, сандық мәтін. Сіз олар оқылғаннан кейін мәтінді сандарға айналдыруыңыз керек. Сандардың қандай екенін білмей, барлық ставкаларды жабу үшін екі еселендіріңіз.

Майкл Бауэрстің жауабы жақсы, бірақ түсіндірме жоқ.

ашық файлды оқу мәтінді контейнерге қосу үшін мәтінге түрлендіру. файлды жабу

менің алуым:

сандарды файлдан векторға беру операторын құру.

ашық векторлық векторды құру векторды толтыру үшін операторды қолдану

// вектормен және istream-мен жұмыс істеу үшін оператор >> құрыңыз std :: istream & operator >> (std :: istream & in, std :: vector & v){ қос d; while (>> d) // ifstream мәтінді-> екі рет түрлендіредіv.push_back (d); // векторға қосу қайтару; // istream-дің өзін қайтарады} // дубльдерді ұстап тұру үшін вектор жасаңызstd :: векторы минумерлер;std :: ifstream inputFile {«file.txt»}; // {} - «инициализация тізімі» синтаксисі while (inputFile)inputFile >> mynwers; // аяқталғанға дейін барлық сандарды енгізіңізinputFile.close (); // файлды жабу// қазір вектор жүктелді, файл жабылды - дайын.

Оқу циклі >> операторының функциясында орналасқан, сондықтан синтаксис шамалы, бірақ өте жақсы оқылады. Барлығы дұрыс болмады (файл табылмады, деректер жоқ ..) және ifstream өзін-өзі тазартады және сәтсіздікке әкеледі, сіз оны ұстап ала аласыз немесе бағдарламаның өлуіне жол бересіз.


жауап 2:

Сұрақ: мәтіндік файлдағы сандарды C ++ форматындағы массивке қалай оқуға болады?

3 бірдей адамның 3 бірдей сұрағына жауап беруі. Оғаш! Біреу Quora-да сұраудың орнына оның жауабын анықтауы мүмкін еді. Маған google-дің қажеті жоқ - мен кодты жадтан және ойдан жаза аламын:

# қосу # қосу # қосу std атау кеңістігін пайдалану;int main (int argc, char ** argv){ ifstream in («file.txt», ifstream :: in);вектор lstСандар; while ((! in.eof ()) && in) { int iNumber = 0; >> iNumber; lstNumbers.push_back (iNumber); } in.close (); // Осы сандармен не істегіңіз келеді ???}

Мен өтірік айттым - мен векторлар класы үшін C ++ сілтемесін google-ге жіберуім керек еді, өйткені мен оны ешқашан қолданбаймын. Мен QT құрылымымен жұмыс істеймін, оның барлық құрылымдық құрылымдары үшін жеке сыныптары бар (тізім, карта, жинақ және т.б.). Сонымен қатар, мен әдетте File I / O-мен жұмыс істемеймін - мен Java-да, негізінен, кәсіби түрде жұмыс істеймін, тіпті JSON және XML файлдарынан басқа файлдармен жұмыс істемеймін, сол үшін бағдарламашыға арналған деректерді шығаратын кітапханалар бар. сондықтан файлды ашу, жабу немесе оқудан қорқудың қажеті жоқ. Бірақ бұл сен үшін қулық жасауы керек деп ойлаймын.

Мен мұны тексерген жоқпын - тек түсінікті болу үшін - Мен жасай алатын бір өзгеріс - файлдың кодын try / catch блогына орау, бірақ C ++ Java сияқты ерекшеліктер туралы анальды емес болғандықтан, мен мұнда болмадым. Try / catch қателіктер, мысалы, файлды ашқан немесе жапқан кезде де пайда болуы мүмкін.


жауап 3:

Сол сияқты бірнәрсе.

Жалпы маған инттарды файлдан тікелей оқу мәнері ұнамайды. Мен жолды бір уақытта оқуға бейім, содан кейін жолды талдаймын. Мен сандарды тікелей оқудың тәртібіне ешқашан 100% сенімді емес екенімді мойындаймын, мысалы, егер сандар емес аралық заттар болса, не болады.

Егер бұл массивті талап ететін жоба болмаса, мен векторды қолданар едім. Массивтер өлшемін өзгертпейді, және бекітілген буферлік бағдарламалар жазу - бұл қате, және мен сізге ең үлкен көлемді жасадым деп күйген кездер туралы айтып бере отырып дәлелдей аламын (олай емес, бірақ бірнеше рет болды .)

# қосу # қосу # қосу # қосу std атау кеңістігін пайдалану;int main () { ifstream myfile («d: \\ numbers.txt»); егер (myfile.is_open ()) { int arrSize = 0;массив arr; // Ең дұрысы бұл вектор болар еді, бірақ сіз массив дедіңіз ал (шын) { int x; myfile >> x; егер (myfile.eof ()) үзіліс; arr [arrSize ++] = x; } үшін (int i = 0; i cout << arr [i] << «»; cout << endl; // Мен бұл жерде файлды жауып тастауым керек еді, бірақ бағдарлама аяқталған кезде мен жалқау болдым} басқа { cout << «Файлды ашу мүмкін емес»; } қайтару 0;}

жауап 4:

Егер сізде файлда тек оқығыңыз келетін сандар бар екеніне сенімді болсаңыз және сіз «массивті» С-дан мұраға қалдырылған жиым-затқа сілтеме жасамай, дерексіз ұғым ретінде қарастыратын болсаңыз, онда ол мүмкін векторды инициализациялау жеткілікті ақылға қонымды (немесе вектор файлдан келесідей:

std :: ifstream енгізу («numbers.txt»);std :: векторы нөмірлер {std :: istream_iterator (енгізу), {}};

(«T» үшін = қандай типті оқығыңыз келсе - int, double, float және т.б.)

Егер сіздің файлыңызда сандар арасында қосымша «қоқыс» болуы мүмкін болса, сіз қаласаңыз, дәл осылай жасай аласыз. Istream_iterator дегеніміз - ағыннан элементтерді оқу үшін >> операторын қолданатын адаптер. Бұл, өз кезегінде, бос кеңістікті елемейді, сондықтан '1 2` 1-ден кейін 2-ге оқылады.

Бірақ міне, иостримдер өте жақсы жасалған жерлердің бірі: иострим бос кеңістіктің не екенін өзі анықтамайды. Керісінше, ол оны ағынның жеріне береді.

Егер біз ағындағы артық қоқыстарды елемеуді қаласақ (мысалы, цифрлық емес барлық нәрселер), қалғандары бос кеңістік деген жерді анықтай аламыз, тек ағыннан біздің сандарды оқып шығыңыз.

struct цифрлары: std :: ctype {цифрлар_тек (): std :: ctype (get_table ()) {} static std :: ctype_base :: маска const * get_table () { // біріншіден, барлығы бос кеңістік деп кесте құрыңыз: статикалық std :: векторы rc (std :: ctype :: table_size, std :: ctype_base :: space); // содан кейін сандарды нақты сандар ретінде орнатыңыз: егер (rc ['0'] == std :: ctype_base :: бос орын) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // таңбаларды сәйкесінше жіктеу үшін кестені қайтару: қайтару & rc [0]; }};

Содан кейін біз ағынға осы тілді қолдануды және ағыннан алынған деректерді оқуды айтамыз:

int main () { std :: istringstream енгізу (R «(11 керексіз 1,00 артық-қажетсіз 16,0 әлі де қажетсіз 1,999! @ # $$% ^ $% & * ақыры орындалды)»); input.imbue (std :: locale (std :: locale (), жаңа сандар_ тек));std :: векторы нөмірлер {std :: istream_iterator (енгізу), {}};}

Жергілікті жерде цифрдан басқасының барлығы бос кеңістік деп айтылғандықтан, сандар арасындағы барлық қосымша «заттар» бос кеңістік ретінде қарастырылады (яғни үнсіз еленбейді), сондықтан біз жай сандарды аламыз.


жауап 5:

Txt файлындағы сандарды келесі код бойынша оқи аласыз.

# қосу

# қосу

# қосу

Void main ()

{char ch; int a; int arr [[30]; int i = 0;

ifstream f1 («abc.txt»);

while (! f1.eof ())

{

fi >> ch;

a = статикалық_каст ч;

arr [i] = a;

}

f1.close ();

getch ();

}

Бұл бағдарлама мәтіндік файлды оқиды, ол осы бағдарламадан бұрын жасалған, өйткені файл txt форматында, сондықтан char айнымалысына бір сан сақтаймыз, өйткені char типтелген айнымалы таңбаларды сақтай алады, содан кейін біз static_cast () функциясын қолданамыз таңбалар мәнін терілген бүтін санға енгізіп, int a-ға қойыңыз, содан кейін біз оның мәнін массивке бір-бірлеп сақтау үшін айнымалыны қолданамыз.

Рақмет сізге …..


жауап 6:

Мен кодты жазбаймын, бірақ қолдан келгеннің бәрін түсіндіремін. Ifstream тақырыбын қолданып, ifstream нысанында EOF (файл соңы) табылғанша цикл жасағыңыз келеді. Цикл кезінде мәтіннің әр жолын жолдық айнымалыға оқыңыз. Әр жолды бос орындармен бөлінген бөліктерге бөлу (жетондау). Әр бөлікке (токенге) оны бүтін санға айналдыруға болатындығын тексеріп көріңіз, егер мүмкін болса, оны тізіміңізге қосыңыз, әйтпесе келесіге өтіңіз. Сонымен, сізде мәтін жолдарын алатын сыртқы цикл және мәтіннің әр жолын бөліктерге бөлетін және одан сан құруға тырысатын ішкі цикл болады.

Ішкі және сыртқы ілмектердің соңғы қайталануынан құтқарғаннан кейін, сізде кез-келген нәрсені жасауға болатын тізім бар.


жауап 7:

Сізде input.txt деген файл бар деп айтыңыз, файлдан бүтін сандарды оқу үшін келесі код үзінділерін пайдалануға болады. Бұл көмектеседі деп үміттенемін :-)

# қосу std атау кеңістігін пайдалану;const int sz = 1001; // массивтің максималды өлшеміне sz орнатыңызint массиві [sz];int main (){ фреопен («input.txt», «r», stdin); int индексі = 0, num; /// файлдың соңына дейін сканерлеңіз while (scanf («% d», & num) == 1) { массив [индекс ++] = сан; } үшін (int i = 0; i printf («% d», массив [i]); printf («\ n»); қайтару 0;}

жауап 8:

Бағдарламалауды үйренуді бастағыңыз келеді ...

Сонымен, мәтіндік файлда цифрлар (ASCII 48..57, мүмкін 'e' және '-' және '.') Және бөлгіштер (ASCII 13,10,9,32, сіздің улануыңыз қандай болса да) бар.

Сонымен, сіз кез келген массивті жеткілікті үлкен int, long int бөліп, файлды байттан байтқа немесе жолдан келесі сепараторға дейін талдай отырып толтыра бастайсыз.

Менің жалақым неге жоғары екенін білесіз бе? Мен мұны өз күшіммен жасадым, көп уақыт жұмсадым және жұмыс берушілер мұны біледі.


жауап 9:

Интернеттен мәтіндік файлды C-массивіне түрлендіретін утилитаны табу керек. Егер сіздің мәтіндік файлыңыз CSV форматында жазылған болса (үтірмен бөлінген мәндер), мен сізде мұндай утилитаны іздеуде қиындықтар болмайды деп ойлаймын. Басқаша айтқанда, сіздің мәтіндік файлыңыз белгілі стандартқа сай болуы керек, бұл жағдайда сіз оны C-массивіне оңай айналдырасыз.


жауап 10:

Классикалық C тәсілі fscanf-ті қолданған болар еді

C ++ тәсілі ifstream-ді stringstream-мен бірге пайдалану болуы мүмкін.

Мүмкін сізге жол ағыны қажет болмауы мүмкін.