زنگ.

کسانی هستند که این خبر را قبل از شما خوانده اند.
مشترک شدن برای دریافت مقالات تازه.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید زنگ را بخوانید
بدون هرزنامه

مکانیزاسیون I / O طراحی شده با سبک به طور کلی پذیرفته شده از اقلام برنامه نویسی شی گرا مطابقت ندارد، علاوه بر این، آن را به طور فعال از عملیات با اشاره گرها استفاده می کند، که به طور بالقوه ناامن در رسانه های محافظت شده مدرن در نظر گرفته شده است. جایگزینی برای توسعه برنامه های کاربردی برنامه استاندارد I / O استاندارد ارائه شده توسط استاندارد زبان C ++ است.

باز کردن فایل ها

اغلب کلاس های IFSTREAM برای خواندن، از دست دادن برای ضبط و fstream برای تغییر فایل ها استفاده می شود.

تمام کلاس های جریان I / O مشتقات غیر مستقیم از اجداد عمومی iOS هستند، به طور کامل به ارث بردن عملکرد آن. بنابراین، حالت افتتاحیه فایل ها یک نوع داده Datainial Type Open_Mode را تعیین می کند که به شرح زیر تعریف شده است:

enum open_mode (برنامه، باینری، در، خارج، trunc، خورد)؛

در زیر ممکن است ارزش های پرچم و هدف آنها باشد.

به عنوان مثال، برای باز کردن فایل به نام test.txt برای خواندن داده ها در فرم باینری، باید نوشت:

فایل IFSTREAM؛ file.open ("test.txt"، iOS :: in | iOS :: باینری)؛

اپراتور منطقی یا (|) به شما امکان می دهد یک حالت را با هر ترکیبی از پرچم ها ایجاد کنید. به طوری که، باز کردن فایل با ضبط، به طور تصادفی فایل موجود را با همان نام جابجا نمی کند، شما باید از فرم زیر استفاده کنید:

فایل از دست؛ file.Open ("test.txt"، iOS :: Out | iOS :: برنامه)؛

فرض بر این است که یک فایل هدر مناسب به پروژه متصل است:

#عبارتند از.

برای بررسی اینکه آیا فایل موفق به باز شدن می شود، می توانید طراحی را اعمال کنید

اگر (فایل) (// پردازش خطای باز کردن فایل)

اپراتورها برای تعویض و استخراج

در کلاس های کار کلاس بیش از حد چاپ شده است گنجاندن اپراتور (<<) записывает данные в файловый поток. Как только вы открыли файл для записи, можно записывать в него текстовую строку целиком:

فایل<< "Это строка текста";

شما همچنین می توانید یک رشته متن را در قطعات ضبط کنید:

فایل<< "Это " << "строка " << "текста";

بیانیه ENDL ورودی رشته را با "بازگشت از Carriage" نماد تکمیل می کند:

فایل<< "Это строка текста" << endl;

با استفاده از بیانیه قدرت، آسان است به ارزش ارزش مقادیر متغیرها یا عناصر آرایه بنویسید:

فایل از دست ("temp.txt")؛ char buff \u003d "آرایه متن شامل متغیرها است"؛ int vx \u003d 100؛ شناور PI \u003d 3.14159؛ فایل<< buff << endl << vx << endl << pi << endl;

به عنوان یک نتیجه از اجرای کد، سه ردیف فایل TEMP.TXT شکل گرفته است:

آرایه متن شامل متغیرهای 100 3.14159 است

لطفا توجه داشته باشید که مقادیر عددی در یک فایل به صورت رشته های متن، نه مقادیر باینری ثبت می شود.

اپراتور استخراج (\u003e\u003e) اقدام معکوس را تولید می کند. به نظر می رسد که کاراکترهای از فایل temp.txt را که قبلا ثبت شده اند استخراج می کنند، شما باید کد را مانند موارد زیر بنویسید:

فایل ifstream ("temp.txt")؛ چارچی int vx؛ شناور PI؛ فایل \u003e\u003e Buff \u003e\u003e VX \u003e\u003e PI؛

با این حال، اپراتور استخراج بر روی اولین جدا کننده ای که کاهش یافته است (فضای، برگه یا نماد رشته جدید) متوقف خواهد شد. بنابراین، هنگام تجزیه حکم، "آرایه متن شامل متغیرهای" تنها کلمه "متن" به آرایه Buff ثبت می شود، فضای نادیده گرفته می شود، و کلمه "آرایه" ارزش کل متغیر VX خواهد بود اعدام کد "چرخانده خواهد شد" با نقض اجتناب ناپذیر ساختار داده ها. بعد، هنگام بحث در مورد کلاس IFStream، نشان داده خواهد شد که چگونه فایل خواندن را از مثال قبلی سازماندهی کنید.

کلاس IFSTREAM: خواندن فایل ها

به شرح زیر از رمزگشایی نام، کلاس IFSTREAM برای وارد کردن جریان فایل طراحی شده است. موارد زیر روش های اصلی کلاس را فهرست می کند. اکثر آنها از کلاس Istream به ارث برده می شوند و با گسترش قابلیت های والدین غرق می شوند. به عنوان مثال، عملکرد دریافت، بسته به پارامتر تماس، قادر به خواندن نه تنها یک شخصیت واحد، بلکه بلوک نماد است.

در حال حاضر روشن است که چگونه به تغییر مثال قبلی برای استفاده از اپراتور استخراج داده ها، نتایج مورد انتظار را ارائه داد:

فایل ifstream ("temp.txt")؛ چارچی int vx؛ شناور PI؛ file.getline (buff، sizeof (buff))؛ فایل \u003e\u003e VX \u003e\u003e PI:

روش GetLine اولین خط فایل را به پایان می رساند، و بیانیه \u003e\u003e مقادیر متغیر را اختصاص می دهد.

مثال زیر نشان می دهد که داده ها را به یک فایل متنی با خواندن زیر از کل فایل اضافه می کند. در حالی که (1) چرخه به جای (! file2.eof ()) به دلایلی که در آن مورد بحث قرار گرفت استفاده می شود.

#عبارتند از. #عبارتند از. استفاده از Namespace STD؛ int main () (file offstream؛ file.open ("test.txt"، iOS :: out | iOS :: برنامه)؛ اگر (فایل) (cout<< "File error - can"t open to write data!"; cin.sync(); cin.get(); return 1; } for (int i=0; i<10; i++) file << i << endl; file.close(); ifstream file2; file2.open("test.txt", ios::in); if (!file2) { cout << "File error - can"t open to read data!"; cin.sync(); cin.get(); return 2; } int a,k=0; while (1) { file2 >\u003e a؛ اگر (file2.eof ()) شکستن؛ cout<< a << " "; k++; } cout << endl << "K=" << k << endl; file2.close(); cin.sync(); cin.get(); return 0; }

مثال زیر یک چرخه خواندن حلقه را از فایل test.txt و صفحه نمایش آنها در کنسول نشان می دهد.

#عبارتند از. #عبارتند از. استفاده از Namespace STD؛ int main () (ifstream file؛ // file فایل فایل را ایجاد کنید (test.txt)؛ // فایل را برای خواندن باز کنید اگر (! file) بازگشت 1؛ // خطای خطا char str؛ / / static row buffer // خواندن و نمایش خطوط در یک حلقه تا EOF (! file.getline (str، sizeof (str)). eof ()) cout<< str << endl; // вывод прочитанной строки на экран cin.sync(); cin.get(); return 0; }

این کد زیر ویندوز نیز بستگی به حضور یک فایل نماد رشته رشته در آخرین ردیف دارد، این امر قابل اعتماد تر خواهد بود:

در حالی که (1) (اگر (file.eof ()) شکستن؛ file.getline (str، sizeof (str))؛ cout<< str << endl; }

تماس های صریح روش های باز و نزدیک لازم نیست. در واقع، فراخوانی سازنده با این استدلال به شما اجازه می دهد تا بلافاصله، در زمان ایجاد یک جریان فایل، فایل را باز کنید:

فایل ifstream ("test.txt")؛

به جای روش نزدیک، شما می توانید از بیانیه حذف استفاده کنید، که به طور خودکار باعث تخریب فایل فایل می شود و فایل را بسته می کند. در حالی که کد چرخه یک بررسی مناسب از پیکربندی پایان فایل را فراهم می کند.

کلاس OSTREAM: فایل های ضبط شده

کلاس OFSTREAM برای خروجی داده ها از جریان فایل طراحی شده است. علاوه بر این، روش های اساسی این کلاس را فهرست می کند.

قبلا شرح داده شده است، اپراتور ورودی مناسب برای سازماندهی ضبط به یک فایل متنی است:

فایل از دست ("temp.txt")؛ اگر (! فایل) بازگشت؛ برای (INT I \u003d 1؛ I<=3; i++) file << "Строка " << i << endl; file.close();

فایل های دودویی

در اصل، داده های باینری مانند متون خدمات می کنند. تفاوت این است که اگر داده های باینری در یک ساختار منطقی خاص نوشته شود، باید از فایل به متغیر نوع ساختاری مشابه بخوانند.

اولین پارامتر روش های نوشتن و خواندن (آدرس بلوک نوشتن / خواندن) باید نوع اشارهگر نماد char * را داشته باشد، بنابراین لازم است که یک تبدیل صریح آدرس ساختار خالی را انجام دهیم. پارامتر دوم نشان می دهد که بلوک های فایل باینری دارای اندازه بایت ثابت هستند، صرف نظر از طول ضبط واقعی. برنامه زیر نمونه ای از ایجاد و نمایش این نوت بوک ساده را فراهم می کند. سپس سوابق فایل در کنسول خوانده شده و نمایش داده می شود.

#عبارتند از. #عبارتند از. #عبارتند از. استفاده از Namespace STD؛ یادداشت های سازنده (// ساختار داده ساختار داده؛ // نام کامل Char Phone؛ / / تلفن INT AGE؛ // سن)؛ int main () (setlocale (lc_all، روسی ")؛ یادداشت های Note1 \u003d (" Grozny John Vasilyevich "،" نصب نشده "، 60)؛ یادداشت note2 \u003d (" Godunov Boris Fedorovich "،" 095-111-2233 "، 30) یادداشت Note3 \u003d ("Romanov Peter Mikhailovich"، "812-333-2211"، 20)؛ از دست رفته ("notebook.dat"، iOS :: باینری)؛ Ofile.write ((char *) & note1، sizeof (یادداشت ها))؛ // 1st block ofile.write ((char *) & note2، sizeof (یادداشت ها))؛ // 2 بلوک Offile.write ((char *) & note3، sizeof (یادداشت ها))؛ / / 3rd Block Ofile.close ()؛ // / / "notebook.dat"، ifstream ثبت شده (notebook.dat "، iOS :: باینری)؛ یادداشت یادداشت؛ // متغیر char str؛ // static row buffer // خواندن و خواندن صفحه نمایش خطوط در حلقه تا EOF در حالی که (! iFile.read ((char *) و توجه داشته باشید، sizeof (یادداشت ها)). eof ()) (sprintf (str، "٪ s \\ tel:٪ s \\ تحویل:٪ d"، note.name، note.phone، note.age)؛ cout<< str << endl; } ifile.close(); // закрыть прочитанный файл cin.sync(); cin.get(); return 0; }

به عنوان یک نتیجه از اجرای این کد، یک فایل notebluse.dat باینری از سه بلوک از 80 بایت هر کدام تشکیل می شود (با توجه به اینکه شخصیت های تک راه هستند). به طور طبیعی، شما می توانید از روش های دیگر جریان استفاده کنید و هر عملیات را در زمینه یک ساختار داده خاص انجام دهید.

کلاس FSTREAM: دسترسی به فایل دلخواه

فرض کنید 100 مدخل در نوت بوک ما انباشته شده و ما می خواهیم 50 ثانیه را حساب کنیم. البته، شما می توانید یک حلقه را سازماندهی کنید و تمام پرونده ها را از اول مشخص کنید. بدیهی است، یک راه حل متمرکز تر، ایجاد یک اشاره گر موقعیت موقعیت موقعیت موقعیت به طور مستقیم به نوشتن 50 و خواندن آن:

Ifstream Ifile ("notebook.dat"، iOS :: باینری)؛ int pos \u003d 49 * sizeof (یادداشت ها)؛ Ifile.seekg (POS)؛ // جستجو برای یادداشت های رکورد 50 یادداشت؛ // یادداشت ها - "ضبط" ساختار "ضبط" Ifile.Read توضیح داده شده در بالا ((char *) و توجه، sizeof (یادداشت ها))؛

چنین عملیات جستجو موثر است اگر فایل شامل سوابق اندازه شناخته شده و ثابت باشد. برای جایگزینی محتویات یک رکورد دلخواه، شما باید جریان خروجی را در حالت اصلاح باز کنید:

Offile ofstream ("notebook.dat"، iOS :: باینری | IOS :: خوردن)؛ int pos \u003d 49 * sizeof (یادداشت ها)؛ SEEKP OFILE (POS)؛ // جستجو برای یادداشت های 50 یادداشت Note50 \u003d ("Yeltsin Boris Nikolaevich"، "095-222-3322"، 64)؛ Ofile.write ((char *) و توجه، sizeof (یادداشت ها))؛ // جایگزینی

اگر شما IOS را مشخص نکنید :: Fail Fail (یا iOS :: APP)، پس از باز کردن فایل باینری Notebook.dat. این پاک خواهد شد!

در نهایت، شما می توانید فایل را در همان زمان برای خواندن / نوشتن، با استفاده از روش های به ارث برده شده توسط کلاس جریان FTREAM از پیشینیان خود باز کنید. از آنجا که کلاس FSTREAM از Istream و Ostream (IFSTREAM و Ostream پدر و مادر به ترتیب) تولید می شود، تمام روش های قبلا ذکر شده در برنامه کاربردی موجود است.

مثال زیر نشان دهنده جایگزینی سوابق اول و سوم فایل notebook.dat است.

#عبارتند از. #عبارتند از. #عبارتند از. استفاده از Namespace STD؛ یادداشت های سازمانی (نام چاپی، تلفن چار؛ عصر INT؛)؛ int main () (setlocale (lc_all "، روسی)؛ یادداشت های Note1، note3؛ // // / / 'notebook.dat' را به طور همزمان (" notebook.dat "، iOS :: باینری | iOS :: in | iOS :: out) ؛ file.seekg (sizeof (notes))؛ // پیدا کردن و شمارش note3 file.Read (char *) & note3، sizeof (یادداشت ها))؛ file.seekg (0)؛ // پیدا کردن و شمارش فایل note1 .read ((char *) & note1، sizeof (یادداشت ها))؛ file.seekg (0)؛ // note1<== Note3 file.write((char*)&Note3, sizeof(Notes)); file.seekg(2 * sizeof(Notes)); // Note3 <== Note1 file.write((char*)&Note1, sizeof(Notes)); char str; // Считывать и отображать записи в цикле, пока не eof file.seekg(0); // вернуться к началу файла while (!file.read((char*)&Note1, sizeof(Notes)).eof()) { sprintf(str, "%s\tТел: %s\tВозраст: %d", Note1.Name, Note1.Phone, Note1.Age); cout << str << endl; } file.close(); cin.sync(); cin.get(); return 0; }

در طراح فایل، شما باید IOS :: IN و IOS را مشخص کنید :: پرچم ها، اجازه اجرای همزمان عملیات خواندن و نوشتن را فراهم می کند. به عنوان یک نتیجه از اجرای این کد، سوابق اول و سوم فایل باینری Notebook.dat در مکان ها تغییر خواهد کرد.

نمونه های اضافی در مورد موضوع هستند.

قبل از این، هنگامی که وارد خروجی داده ها می شوید، ما با جریان های استاندارد - صفحه کلید و مانیتور کار کردیم. در حال حاضر در نظر بگیرید که چگونه زبان C را از فایل ها اجرا کرد و آنها را ثبت کرد. قبل از انجام این عملیات، باید فایل را باز کنید و به آن دسترسی پیدا کنید.

در زبان برنامه نویسی، اشاره گر به فایل دارای فایل نوع و آگهی آن مانند:
فایل * myfile؛

از سوی دیگر، عملکرد Fopen () فایل را به آدرس مشخص شده به عنوان اولین استدلال در حالت خواندن ("R")، ضبط ("W") یا افزودن ("A") باز می کند و اشاره گر را به برنامه باز می گرداند . بنابراین، فرآیند باز کردن یک فایل و اتصال آن به برنامه به نظر می رسد این است:
myfile \u003d fopen ("hello.txt"، "r")؛

هنگام خواندن یا نوشتن داده ها به یک فایل، دسترسی به آن با استفاده از یک اشاره گر فایل (در این مورد، myfile) انجام می شود.

اگر، به موجب دلایل خاص (هیچ فایل در آدرس مشخص شده وجود ندارد، ممنوعیت دسترسی به آن ممنوع است) fopen () عملکرد نمی تواند فایل را باز کند، آن را باز می گرداند. در برنامه های واقعی، تقریبا همیشه خطای باز شدن فایل را در شعبه IF مدیریت می کند، ما بیشتر آن را حذف می کنیم.

تابع Fopen () تابع در فایل هدر Stdio.h موجود است، بنابراین برای اتصال لازم است. همچنین در stdio.h فایل نوع ساختار را اعلام کرد.

پس از کار با فایل به پایان رسید، معمول است که آن را ببندید تا بافر از داده ها را آزاد کنید و به دلایل دیگر. این امر به ویژه مهم است اگر برنامه پس از کار با فایل اجرا شود. شکستن ارتباط بین فایل خارجی و اشاره گر به آن از برنامه با استفاده از تابع FCLOSE () انجام می شود. اشاره گر به فایل به عنوان یک پارامتر منتقل می شود:
fclose (myfile)؛

در برنامه می تواند یک فایل را باز کند. در این مورد، هر فایل باید با اشاره گر فایل آن مرتبط باشد. با این حال، اگر برنامه ابتدا با یک فایل کار کند، سپس آن را بسته می کند، نشانگر می تواند برای باز کردن فایل دوم استفاده شود.

خواندن از یک فایل متنی و نوشتن به آن

fSCANF ()

تابع FSCANF () در معنای عملکرد Scanf () مشابه است، اما در مقایسه با آن، ورودی فرمت شده را از فایل انجام می دهد و نه یک جریان ورودی استاندارد. ویژگی FSCANF () پارامترها را می گیرد: اشاره گر فایل، رشته فرمت، آدرس آدرس حافظه برای ضبط داده ها:
FSCANF (myfile، "٪ s٪ d"، str، & a)؛

تعداد مجموعه داده های موفقیت آمیز یا EOF را باز می گرداند. فضاهای، نمادهای انتقال به یک رشته جدید به عنوان جداساز داده ها به حساب می آیند.

فرض کنید ما یک فایل حاوی چنین شرح اشیاء داریم:

سیب 10 23.4 موز 5 25.0 نان 1 10.3

#عبارتند از. main () (file quip file؛ مواد ساختمانی (نام Char name [20]؛ QTY UNSIGNED؛ قیمت شناور؛)؛ فروشگاه مواد غذایی ساختار [10]؛ char i \u003d 0؛ fopen (fophanf.txt "،" r " )؛ در حالی که (FSCANF (فایل،٪ s٪ u٪ f "، فروشگاه [i] .name، & (shop [i] .qty)، & (shop [i] .price))! \u003d EOF)! "٪ s٪٪٪ .2F \\ n "، فروشگاه [I]. نام، فروشگاه [I] .qty، فروشگاه [i] .price)؛ I ++؛ )

در این مورد، ساختار و آرایه ساختارها اعلام شده است. هر خط از فایل مربوط به یک عنصر از آرایه است؛ عنصر آرایه یک ساختار حاوی رشته و دو فیلد عددی است. در یک تکرار، چرخه یک خط را می خواند. هنگامی که پایان فایل FSCANF رخ می دهد، مقدار EOF را باز می گرداند و چرخه تکمیل می شود.

fgets ()

عملکرد FGETS () شبیه به توابع می شود () است و ورودی خط را از فایل می گیرد. یک تماس FGETS () به شما امکان می دهد یک خط را بخوانید. در این مورد، شما می توانید کل خط را بخوانید، بلکه فقط بخشی از آن است. پارامترهای FGETS () به نظر می رسد:
fgets (array_simvolov، number_name_simvols، pointer__fail)

مثلا:
FGETS (STR، 50، MyFile)

این تماس از این ویژگی از فایل مرتبط با اشاره گر MyFile خوانده می شود، یک خط از متن به طور کامل، اگر طول آن کمتر از 50 کاراکتر باشد، با توجه به نماد "\\ n"، که عملکرد نیز در آن ذخیره می شود آرایه. آخرین (50) عنصر آرایه STR، شخصیت "\\ 0" خواهد بود، اضافه شده FGETS (). اگر رشته طولانی تر باشد، عملکرد 49 کاراکتر را می خواند و در پایان "\\ 0" را ضبط می کند. در این مورد، "\\ n" در یک خط خواندن شامل نخواهد بود.

#عبارتند از. #define n 80 main () (file * file؛ char arr [n]؛ file \u003d fopen (fophanf.txt "،" r ")؛ در حالی که (fgets (arr، n، file)! \u003d null) printf (" ٪ s "، arr)؛ printf (" \\ n ") fclose (فایل)؛ )

در این برنامه، در مقایسه با داده های قبلی، یک رشته در هر خط در آرایه ARR خوانده شده است. هنگامی که رشته بعدی خوانده می شود، قبلی قبلی از دست رفته است. FGETS () اگر شما نمیتوانید رشته زیر را بخوانید، NULL را باز می گرداند.

getc () یا fgetc ()

تابع GETC () یا FGETC () (همچنین کار می کند) به شما اجازه می دهد تا نماد دیگری را از فایل دریافت کنید.

در حالی که ((Arr [i] \u003d FGETC (FILE))! \u003d EOF) (اگر (ARR [I] \u003d\u003d " \\ n ") (Arr [i] \u003d " \0 " ؛ printf ("٪ s \\ n "، ARR)؛ 0 \u003d 0؛ ) ELSE I ++؛ ) ARR [I] \u003d " \0 " ؛ printf ("٪ s \\ n "، ARR)؛

کد توصیف شده به عنوان مثال، داده ها را از فایل به صفحه نمایش می دهد.

ورود به فایل متنی

و همچنین ورودی، خروجی به فایل ممکن است متفاوت باشد.

  • خروجی فرمت تابع Fprintf (نشانگر file_the، فرمت line_، متغیرها).
  • نتیجه گیری پس از پیروزی ویژگی FPUTS (رشته، file_dactor).
  • نتیجه گیری صدا FCTC () یا PUTC (نماد، پخش فایل جستجوگر) عملکرد.

در زیر نمونه هایی از کد استفاده می شود که از سه راه برای خروجی داده ها به یک فایل استفاده می کنند.

ضبط به هر خط از فایل فیلد یک ساختار:

file \u003d fopen ("fprintf.txt"، "w")؛ در حالی که (Scanf ("٪ s٪ u٪ f"، فروشگاه [i] .name، & (shop [i] .qty)، & (shop [i] .price))! \u003d EOF) (fprintf (فایل " ٪ s٪ u٪ .2f \\ n "، فروشگاه [I]. نام، فروشگاه [I] .qty، فروشگاه [i] .price)؛ I ++؛ )

خروجی نهایی به فایل (FPUTS ()، در مقایسه با puts () خود را در انتهای خط "\\ n" قرار نمی دهد):

در حالی که (می شود (arr)! \u003d null) (fputs (arr، file)؛ fputs (" \\ n "، فایل)؛ )

یک نمونه از خروجی peeing:

در حالی که ((i \u003d getchar ())! \u003d eof) putc (i، file)؛

خواندن از فایل باینری و نوشتن به آن

شما نمیتوانید با فایل به عنوان دنباله ای از شخصیت ها کار کنید، اما همانطور که با دنباله بایت ها. در اصل، امکان کار با فایل های نایتستیک وجود ندارد. با این حال، شما می توانید در فایل های متنی بخوانید و بنویسید. مزیت این روش دسترسی به فایل، خواندن سرعت خواندن است: برای یک درخواست تجدید نظر، می توانید یک بلوک قابل توجهی از اطلاعات را بخوانید.

هنگام باز کردن یک فایل برای دسترسی باینری، پارامتر دوم تابع fopen () رشته "RB" یا "WB" است.

موضوع کار با فایل های باینری بسیار پیچیده است، نیاز به یک درس جداگانه برای مطالعه دارد. در اینجا تنها ویژگی های توابع خواندن خواندن را به یک فایل مشخص می شود که به عنوان یک جریان بایت در نظر گرفته می شود.

توابع Fread () و Fwrite () به عنوان پارامترها دریافت می شوند:

  1. آدرس منطقه حافظه که در آن داده ها نوشته شده یا از جایی که خوانده می شوند،
  2. اندازه یک نوع از هر نوع
  3. تعداد داده ها قابل خواندن اندازه،
  4. اشاره گر فایل

این توابع تعداد اطلاعات موفقیت آمیز یا ضبط شده را باز می گرداند. کسانی که. شما می توانید "سفارش" خواندن 50 آیتم داده ها را سفارش دهید و فقط 10 را دریافت کنید. خطاها به وجود نمی آیند.

مثال استفاده از توابع Fread () و Fwrite ():

#عبارتند از. #عبارتند از. main () (فایل * file؛ char shelf1 [50]، shelf2 [100]؛ int n، m؛ fopen \u003d fopen (shelf1.txt "،" rb ")؛ n \u003d fread (sizeof (char)، 50، فایل)؛ fCLOSE (file)؛ file \u003d fopen ("shelf2.txt"، "rb")؛ m \u003d fread (shelf2، sizeof (char)، 50، file)؛ fclose (file)؛ shelf1 [n] \u003d " \0 " ؛ shelf2 [m] \u003d " \\ n "؛ shelf2 [m + 1] \u003d " \0 " ؛ file \u003d fopen ("shop.txt"، "wb")؛ fwrite (shelf2، shelf1)، sizeof (char)، n + m، فایل)؛ fclose (فایل)؛ )

تلاش برای خواندن از اولین فایل 50 کاراکتر وجود دارد. در N، تعداد شخصیت های واقعی خواندن ذخیره می شود. مقدار n می تواند برابر 50 یا کمتر باشد. داده ها در رشته قرار می گیرند. همین اتفاق با فایل دوم اتفاق می افتد. بعد، اولین رشته به دوم متصل می شود و داده ها به فایل سوم بازنشانی می شوند.

وظایف حل

  1. یک برنامه را بنویسید که یک نام فایل متنی (آدرس) یک فایل متنی را درخواست می کند، بیشتر آن را باز می کند و تعداد کاراکترها و خطوط را در نظر می گیرد.
  2. برنامه را بنویسید که داده های دریافت شده از فایل دیگری را به فایل ثبت می کند و به هر حال قبل از رکورد اصلاح شده است. هر خط داده های دریافت شده از فایل باید در ساختار قرار گیرد.

آخرین به روز رسانی: 10/31/2015

برای کار با دایرکتوری ها در فضای نام سیستم، دو کلاس بلافاصله در نظر گرفته شده اند: دایرکتوری و دایرکتوری.

کلاس دایرکتوری

کلاس دایرکتوری تعدادی از روش های استاتیک برای مدیریت دایرکتوری را فراهم می کند. برخی از این روش ها:

    CittleIRctory: یک دایرکتوری را در مسیر مسیر مشخص شده ایجاد می کند

    حذف (مسیر): دایرکتوری را در مسیر مسیر مشخص شده حذف می کند

    وجود دارد (مسیر): تعیین می کند که آیا یک دایرکتوری در مسیر مسیر مشخص شده وجود دارد. اگر وجود داشته باشد، اگر نه، درست باشد، درست است

    GetDirectories (مسیر): لیستی از دایرکتوری ها را در کاتالوگ مسیر می گیرد

    Getfiles (مسیر): لیستی از فایل ها را در فهرست مسیر می گیرد

    حرکت (sourcedirname، destdirname): راهنمای کاتالوگ

    GetParent (مسیر): گرفتن یک کاتالوگ والدین

Class DirectoryInfo.

این کلاس قابلیت ایجاد، حذف، انتقال و سایر عملیات دایرکتوری را فراهم می کند. به طرق مختلف به نظر می رسد دایرکتوری. برخی از خواص و روش های آن:

    ایجاد (): ایجاد یک کاتالوگ

    CreateSubDirectory (مسیر): یک زیرمجموعه را برای مسیر مسیر مشخص شده ایجاد می کند

    حذف (): Deletes Catalog

    وجود دارد ویژگی: تعیین اینکه آیا یک کاتالوگ وجود دارد

    GetDirectories (): لیستی از دایرکتوری ها را می گیرد

    GetFiles (): لیستی از فایل ها را می گیرد

    MoveTo (DestDirname): کاتالوگ را حرکت می دهد

    اموال والدین: گرفتن یک کاتالوگ والدین

    اموال ریشه: گرفتن یک کاتالوگ ریشه

بیایید به نمونه هایی از کاربرد این کلاس ها نگاه کنیم

گرفتن لیستی از فایل ها و زیر شاخه ها

رشته dirname \u003d "c: \\\\"؛ اگر (directory.existsists (dirname)) (console.writeline ("subdatalogues:")؛ رشته dirs \u003d directory.getDirectories (dirname)؛ foreach (رشته S در DIRS) (console.writeline (s)؛) console.writeline ( )؛ console.writeline ("فایل ها:")؛ رشته های رشته \u003d directory.getfiles (dirname)؛ foreach (رشته s در فایل ها) (console.writeline (s)؛))

توجه به استفاده از قفسه ها در نام فایل ها. یا ما از یک دوبعدی استفاده می کنیم: "C: \\\\"، یا تک، اما پس از آن قبل از همه با قرار دادن علامت @: "C: \\ فایل های برنامه"

ایجاد کاتالوگ

مسیر رشته \u003d @ "C: \\ Somedir؛ رشته subpath \u003d @ "برنامه \\ avalon؛ DirectoryInfo Dirinfo \u003d New DirectoryInfo (مسیر)؛ اگر (dirinfo.create ()؛) dirinfo.createsubdirectory (subpath)؛

ابتدا چک کنید، و هیچ یک از این پوشه ها وجود ندارد، زیرا اگر وجود داشته باشد، آن را غیر ممکن خواهد ساخت، و برنامه اشتباه را پرتاب خواهد کرد. در نتیجه، ما راه زیر را خواهیم داشت: "C: \\ Somedir \\ Program / Avalon"

دریافت اطلاعات در مورد کاتالوگ

رشته dirname \u003d "C: \\\\ فایل های برنامه"؛ directoryInfo dirinfo \u003d new directoryInfo (dirname)؛ console.writeline ($ "نام کاتالوگ: (dirinfo.name)")؛ console.writeline ($ "نام کاتالوگ کامل: (dirinfo.fullname)")؛ CONSOLE.WRITELINE ($ "زمان ایجاد زمان ایجاد: (dirinfo.creationtime)")؛ console.writeline ($ "دایرکتوری ریشه: (dirinfo.root)")؛

حذف کاتالوگ

اگر ما به سادگی روش حذف را به یک پوشه غیر خالی اعمال کنیم، که در آن هر فایل یا زیرمجموعه وجود دارد، برنامه ما یک خطا را پرتاب می کند. بنابراین، ما باید گزینه نوع Boolean اضافی را به روش حذف انتقال دهیم، که نشان می دهد که پوشه باید با تمام مطالب حذف شود:

رشته dirname \u003d @ "C: \\ Sealfolder؛ سعی کنید (DirectoryInfo Dirinfo \u003d New DirectoryInfo (DIRNAME)؛ DIRINFO.DELETE (TRUE)؛ CONSOLE.WRITELINE ("کاتالوگ راه دور")؛) گرفتن (استثناء EX) (Console.writeline (ex.sessage)؛)

رشته dirname \u003d @ "C: \\ Sealfolder؛ دایرکتوری dealete (dirname، true)؛

کاتالوگ متحرک

رشته oldpath \u003d @ "C: \\ Sealfolder؛ رشته newpath \u003d @ "C: \\ Somedir؛ directoryInfo dirinfo \u003d new directoryInfo (oldpath)؛ اگر (dirinfo.exists && directory.exists (newpath) \u003d\u003d false) (dirinfo.moveto (newpath)؛)

هنگام حرکت، باید در نظر داشته باشید که دایرکتوری جدید که در آن ما می خواهیم تمام محتویات دایرکتوری قدیمی را ایجاد کنیم نباید وجود داشته باشد.

اکثر برنامه های کامپیوتری با فایل ها کار می کنند و بنابراین لازم است برای ایجاد، حذف، نوشتن، خواندن، فایل های باز لازم باشد. فایل چیست؟ این فایل یک مجموعه نامی از بایت است که می تواند بر روی برخی از درایو ذخیره شود. خوب، در حال حاضر روشن است که تحت فایل آن را به عنوان یک دنباله از بایت ها، که دارای نام خود، نام منحصر به فرد، به عنوان مثال file.txt است، قابل درک است. در یک دایرکتوری ممکن است فایل ها با نام های مشابه وجود داشته باشد. تحت نام فایل نه تنها توسط نام آن قابل درک است، بلکه همچنین گسترش، به عنوان مثال: file.txt و file.dat فایل های مختلف، اگر چه نامهای مشابه دارند. چنین چیزی وجود دارد به عنوان نام کامل فایل ها آدرس کامل به دایرکتوری فایل با نام نام فایل، به عنوان مثال: d: \\ docs \\ file.txt. مهم است که این مفاهیم اساسی را درک کنیم، در غیر این صورت کار با فایل ها دشوار خواهد بود.

برای کار با فایل ها، باید فایل هدر را وصل کنید . که در چندین کلاس تعریف شده اند و فایل های هدر متصل هستند. ورودی فایل I. خروجی فایل

ورودی / خروجی فایل شبیه به ورودی / خروجی استاندارد است، تنها تفاوت این است که ورودی / خروجی بر روی صفحه نمایش نیست، بلکه به فایل است. اگر وارد / خروجی به دستگاه های استاندارد با استفاده از CIN و COT اشیاء انجام شود، به اندازه کافی برای ایجاد اشیاء خود که می تواند به طور مشابه به اپراتورهای CIN و COT استفاده شود، کافی است.

به عنوان مثال، شما باید یک فایل متنی ایجاد کنید و به رشته ای بنویسید تا با فایل های C ++ کار کنید. برای انجام این کار، شما باید مراحل زیر را انجام دهید:

  1. یک جسم کلاس از دست ایجاد کنید ;
  2. یک شیء کلاس را با یک فایل که رکورد ساخته خواهد شد، قرار دهید؛
  3. یک رشته را به یک فایل ضبط کنید
  4. بستن فایل

چرا لازم است یک جسم کلاس از دست، نه کلاس را ایجاد کنیم؟ از آنجا که شما نیاز به ضبط فایل دارید و اگر لازم بود داده ها را از فایل بخوانید، سپس شیء کلاس IFSTREAM ایجاد می شود.

// ایجاد یک شی برای نوشتن به نام فایل / * * /؛ // کلاس کلاس از دست

بیایید با شیء تماس بگیریم، این چیزی است که اتفاق می افتد:

FOUT از دست؛

هدف ما چیست؟ هدف لازم است که شما می توانید به فایل بنویسید. شی در حال حاضر ایجاد شده است، اما با فایل مرتبط نیست که رشته باید ثبت شود.

fout.open ("cppstudio.txt")؛ // ما یک شی را با فایل مرتبط می کنیم

از طریق عملیات، ما دسترسی به روش کلاس باز () را در براکت های دور که نام فایل را مشخص می کنید، به دست می آوریم. فایل مشخص شده در دایرکتوری فعلی با برنامه ایجاد خواهد شد. اگر فایل با همان نام وجود داشته باشد، فایل موجود توسط جدید جایگزین خواهد شد. بنابراین، فایل باز است، آن را باقی می ماند برای نوشتن به آن رشته مورد نظر. این کار مانند این است:

FOUT<< "Работа с файлами в С++"; // запись строки в файл

با استفاده از انتقال انتقال به جریان، همراه با شیء Fout، کار با فایل ها در C ++ به فایل نوشته شده است. از آنجا که دیگر نیازی به تغییر محتویات فایل وجود ندارد، باید بسته شود، یعنی جدا کردن جسم از فایل.

fout.close ()؛ // بستن فایل

نتیجه - یک فایل را با یک رشته کار با فایل های C ++ ایجاد کرد.

مراحل 1 و 2 می تواند ترکیب شود، یعنی، در یک ردیف، یک شی را ایجاد کنید و آن را به فایل پیوند دهید. این کار مانند این است:

Fout از دست ("cppstudio.txt")؛ // ایجاد یک شی از کلاس Ostream و پیوند آن را به فایل cppstudio.txt

ما کل کد را ترکیب می کنیم و برنامه زیر را دریافت می کنیم.

// file.cpp: نقطه ورودی را برای برنامه کنسول تعیین می کند. #include "stdafx.h" #include استفاده از Namespace STD؛ INT MAIN (OFS ARGC، ARGV) (FOUT FOUT)؛ // ایجاد یک شی از کلاس Ostream برای نوشتن و پیوند آن به فایل CPPStudio.txt Fout<< "Работа с файлами в С++"; // запись строки в файл fout.close(); // закрываем файл system("pause"); return 0; }

این برای بررسی صحت برنامه باقی می ماند و برای این فایل باز می شود cppstudio.txt و ما به محتویات آن نگاه می کنیم، باید باشد - کار با فایل ها در C ++.

  1. ایجاد یک شیء کلاس IFSTREAM و پیوند آن به فایل که از آن خواندن بررسی خواهد شد؛
  2. فایل را بخوانید
  3. بستن فایل
// file_read.cpp: نقطه ورودی را برای برنامه کنسول مشخص می کند. #include "stdafx.h" #include #عبارتند از. استفاده از Namespace STD؛ Int Main (int argc، char * argv) (setlocale)؛ // cryillic cirillic نمایشگر Char buff؛ // ذخیره سازی متوسط \u200b\u200bبافر از متن IFSTREAM FIN (CPPSTUDIO.TXT ")؛ // فایل باز شده برای خواندن FIN \u003e\u003e<< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку system("pause"); return 0; }

این برنامه دو روش خواندن از فایل را نشان می دهد، اولین بار - استفاده از عملیات انتقال به جریان، دوم - استفاده از تابع GetLine () . در اولین مورد، تنها اولین کلمه خوانده می شود، و در مورد دوم، رشته خواندن، 50 کاراکتر طولانی است. اما از آنجا که کاراکترهای کمتری در فایل وجود دارد، کاراکترها به عنوان آخرین خوانده شده اند. توجه داشته باشید که خواندن یک بار دیگر (ردیف 17) پس از اولین کلمه، و نه از همان ابتدا، از آنجایی که اولین کلمه خوانده شدردیف 14. نتیجه برنامه در شکل 1 نشان داده شده است.

کار با فایل های C ++ برای ادامه، هر کلید را فشار دهید. . .

شکل 1 - کار با فایل ها در C ++

این برنامه به درستی کار کرد، اما همیشه اتفاق نمی افتد، حتی اگر با کد خوب باشد. به عنوان مثال، برنامه نام یک فایل غیر موجود را ارسال کرد یا یک خطا به نام ساخته شده است. بعدش چی شد؟ در این مورد، هیچ چیز در همه اتفاق نمی افتد. فایل یافت نشد، و بنابراین امکان خواندن آن وجود ندارد. بنابراین، کامپایلر خطوطی را که در آن کار با فایل اجرا می شود را نادیده می گیرد. در نتیجه، این برنامه به درستی تکمیل خواهد شد، اما هیچ چیز روی صفحه نمایش نشان داده نخواهد شد. به نظر می رسد که این یک واکنش کاملا طبیعی به چنین وضعیتی است. اما کاربر ساده روشن نخواهد بود که موضوع چیست و چرا خط بر روی صفحه نمایش از فایل ظاهر نمی شود. بنابراین، به طوری که همه چیز در C ++ بسیار روشن است، چنین عملکرد را فراهم می کند - IS_OPEN ()، که مقادیر عدد صحیح را باز می گرداند: 1 - اگر فایل با موفقیت باز شود، 0 - اگر فایل باز نیست. ما برنامه را با باز کردن فایل نهایی می کنیم، به طوری که اگر فایل باز نباشد، پیام مربوطه نمایش داده شد.

// file_read.cpp: نقطه ورودی را برای برنامه کنسول مشخص می کند. #include "stdafx.h" #include #عبارتند از. استفاده از Namespace STD؛ int main (int argc، char * argv) (setlocale)؛ // اصلاح Cirillic Cirillic Display؛ // بافر ذخیره سازی متوسط \u200b\u200bاز فایل فایل IFSTREAM FIN (CPPSTUDIO.DOC ")؛ // (نام فایل اشتباه را وارد کنید) اگر (! fin.is_open ()) // اگر فایل Cout باز نیست<< "Файл не может быть открыт!\n"; // сообщить об этом else { fin >\u003e buff؛ // اولین کلمه را از فایل COUT در نظر گرفت<< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку } system("pause"); return 0; }

نتیجه برنامه در شکل 2 نشان داده شده است.

فایل را نمی توان باز کرد! برای ادامه، هر کلید را فشار دهید. . .

شکل 2 - کار با فایل ها در C ++

همانطور که می توانید از شکل 2 ببینید، این برنامه در مورد عدم توانایی برای باز کردن فایل گزارش شده است. بنابراین، اگر برنامه با فایل ها کار کند، توصیه می شود از این تابع استفاده کنید، iS_Open ()، حتی اگر مطمئن باشید که فایل وجود دارد.

حالت های باز کردن فایل

حالت های باز کردن فایل استفاده از فایل ها را تنظیم می کنند. برای تنظیم حالت در کلاس iOS_Base، ثابت هایی وجود دارد که حالت باز کردن فایل ها را تعیین می کنند (جدول 1 را ببینید).

حالت های باز کردن فایل را می توان به طور مستقیم در هنگام ایجاد یک شی یا هنگام تماس با عملکرد باز () .

FOUT از دست ("cppstudio.txt"، iOS_Base :: برنامه)؛ // فایل را برای اضافه کردن اطلاعات به انتهای فایل fout.Open ("cppstudio.txt"، iOS_Base :: برنامه را باز کنید. // فایل را برای اضافه کردن اطلاعات به انتهای فایل باز کنید

حالت های باز کردن فایل را می توان با استفاده از یک عملیات منطقی Biddly ترکیب کرد. یا | ، به عنوان مثال: ios_base :: خارج | iOS_BASE :: TRUNC - باز کردن یک فایل برای ضبط، قبلا پاکسازی آن.

اشیاء کلاس Ostream، هنگام اتصال به فایل ها به طور پیش فرض، شامل حالت های باز کردن فایل iOS_Base :: Out | ios_base :: trunc. . به عبارت دیگر، فایل ایجاد خواهد شد اگر آن وجود ندارد. اگر فایل وجود داشته باشد، محتویات آن حذف خواهد شد، و فایل خود را برای ضبط آماده خواهد شد. اشیاء کلاس IFSTREAM مرتبط با فایل، حالت پیش فرض باز کردن فایل iOS_Base را دارند :: در - فایل فقط برای خواندن باز است. حالت باز کردن فایل نیز پرچم نامیده می شود، برای خوانایی در آینده ما از این اصطلاح خاص استفاده خواهیم کرد. جدول 1 همه پرچم ها را لیست نمی کند، اما برای شروع این باید کافی باشد.

لطفا توجه داشته باشید که پرچم های ATE و APP بسیار شبیه به شرح هستند، هر دو اشاره گر را به انتهای فایل منتقل می کنند، اما پرچم برنامه به شما اجازه می دهد تا ضبط کنید، فقط در انتهای فایل، و پرچم Ate به سادگی دوباره مرتب می شود پرچم تا انتهای فایل و مکان های ضبط را محدود نمی کند.

ما یک برنامه را توسعه خواهیم داد که با استفاده از عملیات sizeof ()، ویژگی های نوع داده های اصلی را در C ++ محاسبه می کند و آنها را به فایل ارسال می کند. مشخصات:

  1. تعداد بایت اطمینان حاصل شده توسط نوع داده
  2. حداکثر مقدار که می تواند نوع خاصی را ذخیره کند.

ورود فایل باید در چنین فرمت انجام شود:

/ * نوع داده بایت حداکثر مقدار bool \u003d 1 255.00 char \u003d 1 255.00 INTT \u003d 2 32767.00 Unsigned Int \u003d 4 2147483647.00 Unsigned int \u003d 4 21474967295.00 Untt int \u003d 4 2147483647.00 Unsigned Long Int \u003d 4 4294967295.00 Float \u003d 4 2147483647.00 Float Long Float \u003d 8 9223372036854775800.00 DOUBLE \u003d 8 9223372036854775800.00 * /

چنین برنامه قبلا در بخش توسعه یافته است، اما تمام اطلاعات مربوط به انواع داده ها بر روی یک دستگاه خروجی استاندارد نمایش داده شد و ما باید برنامه را بازسازی کنیم تا اطلاعات به فایل نوشته شود. برای انجام این کار، شما باید فایل را در حالت ضبط باز کنید، با ترمینال اولیه اطلاعات فایل فعلی ( ردیف 14) به محض این که فایل ایجاد شده و با موفقیت باز شود (رشته های 16 - 20)، به جای اپراتور COUT، در ردیف 22از شیء Fout استفاده کنید. بنابراین، به جای صفحه نمایش، اطلاعات مربوط به انواع داده ها در یک فایل ثبت می شود.

// write_file.cpp: نقطه ورود را برای برنامه کنسول تعیین می کند. #include "stdafx.h" #include #عبارتند از. // کار با فایل های #include // با استفاده از manipulators ورودی / خروجی Namespace STD؛ int main (int argc، char * argv) (setlocale)؛ // ما شی را با فایل متصل می کنیم، در حالی که فایل را در حالت ضبط باز می کنیم، پس از حذف تمام داده ها از آن از Fout Fout ("data_types.txt"، iOS_Base :: Out | ios_base :: Trunc)؛ اگر (fout.is_open ()) // اگر فایل باز نشده باشد (cout<< "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение return 1; // выполнить выход из программы } fout << " data type " << "byte" << " " << " max value " \u003c\u003c endl // headers ستون \u003c\u003c"bool = " << sizeof(bool) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl << "char = " << sizeof(char) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl << "short int = " << sizeof(short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl << "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl << "int = " << sizeof(int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl << "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl << "long int = " << sizeof(long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl << "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl << "float = " << sizeof(float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl << "long float = " << sizeof(long float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long float*/ << (pow(2,sizeof(long float) * 8.0 - 1) - 1) << endl << "double = " << sizeof(double) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных double*/ << (pow(2,sizeof(double) * 8.0 - 1) - 1) << endl; fout.close(); // программа больше не использует файл, поэтому его нужно закрыть cout << "Данные успешно записаны в файл data_types.txt\n"; system("pause"); return 0; }

غیر ممکن نیست که توجه داشته باشید که تغییرات در برنامه حداقل است و همه به دلیل این واقعیت است که ورودی / خروجی استاندارد و ورودی / خروجی فایل مورد استفاده قرار می گیرد کاملا مشابه است. در پایان برنامه، درردیف 45 ما به وضوح فایل را بسته کردیم، هرچند لزوما این نیست، اما یک لحظه خوب از برنامه نویسی محسوب می شود. شایان ذکر است که تمام توابع و دستکاری های مورد استفاده برای فرمت ورودی / خروجی استاندارد مربوط به ورودی / خروجی فایل هستند. بنابراین، زمانی که اپراتور هیچ خطایی رخ نداده است cout این جایگزین توسط جسم جایگزین شد FOUT

در این مقاله ما یاد می گیریم که چگونه اطلاعات را از فایل ها بخوانیم و اطلاعات را به فایل ها در برنامه های SI ضبط کنیم. فایل ها در SIبرای صرفه جویی در نتیجه برنامه SI استفاده می شود و از آن با یک برنامه جدید استفاده کنید. به عنوان مثال، شما می توانید نتایج محاسبات، آمار بازی را ذخیره کنید.
برای کار با فایل های C، شما باید کتابخانه stdio.h را وصل کنید
#عبارتند از.
برای کار S. فایل در SI شما باید یک اشاره گر را به فایل نمونه مشخص کنید.
فایل * نام اشاره گر به فایل؛
مثلا
فایل * fin؛
اشاره گر را به فایل مشخص می کند
بعد، باید فایل را باز کنید و آن را به اشارهگر فایل متصل کنید. برای باز کردن فایل در خواننده، از دستور استفاده کنید
نام اشاره گر به فایل \u003d fopen ("مسیر به فایل"، "R")؛
به عنوان مثال، تیم زیر
fin \u003d fopen ("C: \\\\ کاربران \\\\ کاربر \\\\ دسکتاپ \\\\ data.txt"، "r")؛
این فایل data.txt بر روی دسکتاپ در امتداد مسیر C را باز می کند خواص فایل را انتخاب کنید. در بخش محل، مسیر فایل مشخص خواهد شد. لطفا توجه داشته باشید که مسیر با استفاده از دو تخت مشخص شده است.
پس از کار با فایل SI، باید آن را با استفاده از فرمان بسته کنید.
fclose (نام اشاره گر به فایل)

خواندن اطلاعات از یک فایل متنی در SI

برای خواندن شخصیت های روسی از فایل، شما باید کار را با Cyrillic با استفاده از دستور پیکربندی کنید
setlocale (lc_all، "روسی")؛

در عین حال، لازم است که #include در ابتدای برنامه ارتباط برقرار شود

FSCANF () اپراتور

برای خواندن کلمه از فایل در SI فرمان FSCANF () استفاده می شود. این دستور شبیه به فرمان ورودی اطلاعات از سوئیچ کلید است، تنها پارامتر اول یک اشاره گر به فایل است.
fSCANF (اشاره گر به فایل، "٪ داده های ورودی داده 1٪ فرمت داده ها ..."، و پرندگان 1، و متغیر 2 ...)؛
به عنوان مثال، تیم
fSCANF (FIN، "٪ d٪ d٪ D"، & a، & b، & c)؛
معتقد است از فایل که به اشاره گر به فایل باله از سه متغیر عدد صحیح وابسته است
ما نمونه ای از یک برنامه را که از فایل متنی data.txt خوانده می شود، تجزیه و تحلیل خواهیم کرد که سه رقم را ضبط می کند و آن را در آرایه ها می نویسد. برای هر ستون اطلاعات، آرایه آن. جزئیات در مورد
#عبارتند از.
#عبارتند از.
اصلی ()
(int a؛
int b؛
int c؛
INT I؛
// اشاره گر را به فایل تعیین کنید
فایل * fin؛
// فایل را برای خواندن باز کنید
fin \u003d fopen ("C: \\\\ کاربران \\\\ کاربر \\\\ دسکتاپ \\\\ data.txt"، "r")؛
// خواندن درجه از فایل
برای (i \u003d 0؛ من<3;i++)
{
// خواندن یک رشته از سه مقدار فایل و یک رکورد آرایه
FSCANF (FIN، "٪ d٪ d٪ D"، & a [i]، & b [i]، & c [i])؛
}
// نتیجه گیری آرایه ها بر روی صفحه نمایش
برای (i \u003d 0؛ من<3;i++)
{
printf ("٪ d٪ d٪ d"، a [i]، b [i]، c [i])؛
}
getch ()؛
// بسته شدن فایل
fclose (fin)؛
}

موقعیت خواندن اطلاعات از فایل در C. FGETS FGETS ()

بیانیه FSCANF () این کلمه را از فایل می نویسد، I.E. قبل از اولین فضای آینده.
برای خواندن کل خط از فایل از فایل در سیستم.
اگر (null! \u003d fgets (متغیر رشته، طول رشته، اشاره گر به فایل))
{
اقدامات هنگام خواندن خط
}

به عنوان مثال، یک برنامه در SI که دو خط از فایل را می خواند و آنها را روی صفحه نمایش نشان می دهد
#عبارتند از.
#عبارتند از.
#عبارتند از.
اصلی ()
{
// تنظیم رشته دائمی
char st1؛
char st2؛
// اشاره گر را به فایل تعیین کنید
فایل * fin؛
// کار نست با سیریلیک
setlocale (lc_all، "روسی")؛
// فایل را برای خواندن باز کنید
fin \u003d fopen ("c: \\\\ data.txt"، "r")؛
// رشته اول را از فایل بخوانید
اگر (null! \u003d fgets (ST1، 100، Fin))
{
// رشته روی صفحه نمایش را نمایش می دهد
printf ("٪ s"، st1)؛)
// رشته دوم را از فایل بخوانید
اگر (null! \u003d fgets (ST2، 100، Fin))
{
// رشته روی صفحه نمایش را نمایش می دهد
printf ("٪ s"، st2)؛)
// فایل را برای خواندن ببندید
fclose (fin)؛
}

اطلاعات ضبط در یک فایل متنی در SI

برای ضبط داده ها به فایل در SI، شما باید فایل را در حالت ضبط باز کنید
نام اشارهگر به فایل \u003d fopen ("مسیر به فایل"، "W")؛
برای نوشتن به رشته فایل متنی، از دستور fprnitf () استفاده کنید، که شبیه فرمان در پارامتر دوم است. این اشاره گر به فایل
fprintf (نام اشاره گر به فایل، "٪ فرمت ورودی"، متغیرها)؛
به عنوان مثال، به متغیر مقدار فایل out.txt ارسال کنید
a \u003d 10؛
fout \u003d fopen ("C: \\\\ کاربران \\\\ کاربر \\\\ desktop \\\\ out.txt"، "w")؛
fprintf (fout، "٪ d"، a)؛

یک نمونه از یک برنامه در SI که دو عدد را درخواست می کند و به فایل Out.txt هر دو این اعداد و مجموع آنها می نویسد

#عبارتند از.
#عبارتند از.

اصلی ()
(int a؛
int b؛
int c؛
فایل * Fout؛
fout \u003d fopen ("C: \\\\ کاربران \\\\ کاربر \\\\ desktop \\\\ out.txt"، "w")؛
printf ("شماره اول را وارد کنید")؛
Scanf ("٪ d"، & a)؛
printf ("شماره دوم را وارد کنید")؛
Scanf ("٪ d"، & b)؛
c \u003d a + b؛
fprintf (fout، "٪ d٪ d٪ d"، a، b، c)؛
getch ()؛
fclose (fout)؛
}

زنگ.

کسانی هستند که این خبر را قبل از شما خوانده اند.
مشترک شدن برای دریافت مقالات تازه.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید زنگ را بخوانید
بدون هرزنامه