نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی

نوشتن C در یک فایل متنی خواندن و نوشتن یک فایل

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

در زبان برنامه نویسی C، اشاره گر به یک فایل از نوع FILE است و اعلان آن به شکل زیر است:
FILE *myfile;

از طرف دیگر، تابع ()fopen فایلی را در آدرسی که به عنوان اولین آرگومان آن در حالت خواندن ("r")، حالت نوشتن ("w")، یا حالت اضافه ("a") مشخص شده است، باز می کند و یک اشاره گر را برمی گرداند. به آن برنامه. بنابراین، روند باز کردن یک فایل و اتصال آن به برنامه چیزی شبیه به این است:
myfile = fopen("hello.txt", "r");

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

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

اعلان تابع fopen() در فایل هدر stdio.h موجود است، بنابراین باید گنجانده شود. همچنین در stdio.h نوع ساختار FILE اعلام شده است.

پس از پایان کار با یک فایل، مرسوم است که آن را ببندید تا بافر از داده ها و به دلایل دیگر آزاد شود. این امر به ویژه در صورتی مهم است که برنامه پس از کار با فایل به کار خود ادامه دهد. قطع ارتباط بین یک فایل خارجی و یک اشاره گر به آن از برنامه با استفاده از تابع 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 * file; struct food ( char name[ 20 ] ; unsigned quty; Float price; ) ; struct food shop[ 10 ] ; char i= 0 ; file = fopen ( "fscanf.txt" , "r" ) ؛ while (fscanf (پرونده، "%s%u%f" , shop[i].name , & (shop[i].qty ) , & (shop[i].price ) ) != EOF) (printf ("%s %u %.2f \n", فروشگاه[ i].نام، فروشگاه[ i].قطع، فروشگاه[ i].قیمت) ; i++; ))

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

fgets()

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

مثلا:
fgets (str, 50, myfile)

اگر طول آن کمتر از 50 کاراکتر باشد، این فراخوانی تابع از فایل مرتبط با نشانگر myfile یک خط کامل متن را می خواند، از جمله کاراکتر "\n"، که تابع نیز در یک آرایه ذخیره می کند. آخرین عنصر (50) آرایه str، کاراکتر "\0" خواهد بود که توسط fgets() اضافه شده است. اگر رشته طولانی‌تر باشد، تابع 49 کاراکتر را می‌خواند و در پایان «\0» می‌نویسد. در این مورد، "\n" در خط خواندن وجود نخواهد داشت.

#عبارتند از #define N 80 main () ( FILE * file; char arr[N] ; file = fopen ( "fscanf.txt" , "r" ) ؛ while (fgets (arr, N, file) != NULL) printf (" %s" ، arr) ؛ printf (" \n") ؛ fclose(file); )

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

getc() یا fgetc()

تابع getc() یا fgetc() (هر دو کار می کنند) به شما این امکان را می دهد که کاراکتر تک بعدی را از یک فایل دریافت کنید.

while ((arr[i] = fgetc (پرونده) ) != EOF) (اگر (arr[i] ==" \n") (arr[i] = " \0 " ; printf("%s \n"، arr)؛ i = 0 ; ) else i++; )arr[i] = " \0 " ; printf("%s \n"، arr)؛

کد مثال داده های یک فایل را روی صفحه نمایش می دهد.

نوشتن در یک فایل متنی

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

  • خروجی فرمت شده تابع fprintf (file_index، format_string، متغیرها).
  • خروجی پست به خط تابع fputs (رشته، file_pointer).
  • خروجی کاراکتر به کاراکتر. تابع fputc() یا putc(symbol, file_pointer) .

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

نوشتن فیلدهای یک ساختار در هر خط از فایل:

file = fopen ("fprintf.txt" , "w" ); while (scanf ("%s%u%f" , shop[i].name , & (shop[i].qty ) , & (shop[i].price ) != EOF) (fprintf (پرونده، " %s %u %2f \n", فروشگاه[ i].نام، فروشگاه[ i].قطع، فروشگاه[ i].قیمت) ; i++; )

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

while (gets (arr) != NULL) (fputs (arr, file)؛ fputs (" \n"، فایل)؛ )

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

while ((i = getchar () ) != EOF) putc (i، فایل) ;

خواندن و نوشتن در یک فایل باینری

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

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

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

توابع fread() و fwrite() به عنوان پارامتر در نظر گرفته می شوند:

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

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

مثالی از استفاده از توابع fread() و fwrite():

#عبارتند از #عبارتند از main () ( FILE * file; char shelf1[ 50 ], shelf2[ 100 ] ; int n, m; file = fopen ("shelf1.txt" , "rb" ) ; n= fread (shelf1, sizeof (char ) , 50 , file) ؛ fclose (پرونده) ؛ file = fopen ("shelf2.txt" , "rb" ) ؛ m= fread (shelf2, sizeof (char ) , 50 , file) ؛ fclose (پرونده) ؛ shelf1[n] =" \0 " ; shelf2[m] = " \n"; shelf2[ m+ 1 ] = " \0 " ; file = fopen ("shop.txt" , "wb" ); fwrite (strcat (shelf2, shelf1) , sizeof (char ) , n+ m, file) ; fclose(file); )

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

حل مسئله

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

- مقایسه برای شناسایی برابری یا نابرابری.

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

مثالی از استفاده از متغیرهای شمارش شده:

mo=1, tu, we, th, fr, sa, su ) days;

puts(" روز هفته (از 1 تا 7) را وارد کنید: "); scanf("%d"، &t_day);

w_day = su; شروع = ماه؛

پایان = w_day -t_day;

printf("\nدوشنبه %d روز هفته است، \اکنون %d روز است.\n\

تا پایان هفته %d روز (روز). ", start, t_day, end);

نتیجه برنامه: روز هفته (از 1 تا 7) را وارد کنید: 2

دوشنبه اولین روز هفته است، اکنون روز دوم است. 5 روز (روز) تا پایان هفته فرصت باقیست.

18. فایل ها به زبان C

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

دو نوع فایل وجود دارد: متنی و باینری. فایل های متنی دنباله ای از کاراکترهای ASCII هستند و با استفاده از هر ویرایشگر متنی قابل مشاهده و ویرایش هستند.

فایل های باینری (دودویی) دنباله ای از داده ها هستند که ساختار آنها توسط نرم افزار تعیین می شود.

زبان C مجموعه بزرگی از توابع برای کار با فایل ها دارد که بیشتر آنها در کتابخانه های stdio.h و io.h یافت می شوند.

18.1. باز کردن یک فایل

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

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

FILE * اشاره گر به فایل.

FILE - شناسه نوع ساختار شرح داده شده در کتابخانه استاندارد

stdio.h و حاوی اطلاعات زیر است:

struct را تایپ کنید(

- تعداد بایت های خوانده نشده باقی مانده در بافر؛

اندازه معمول بافر 512 بایت است. به محض سطح = 0،

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

– پرچم وضعیت فایل – خواندن، نوشتن، الحاق؛

- توصیفگر فایل، به عنوان مثال عددی که نه آن را مشخص می کند

char unsigned hold;

- شخصیت منتقل نشده، یعنی ungetc-character;

- اندازه بافر میانی داخلی؛

بافر char unsigned;

- مقدار اشاره گر برای دسترسی به داخل بافر، یعنی.

شروع بافر، ابتدای خط یا مقدار فعلی را مشخص می کند

مقدار اشاره گر داخل بافر بسته به حالت

ma buffering;

char بدون امضا *curp;

- مقدار فعلی اشاره گر برای دسترسی به داخل

fera، یعنی موقعیت فعلی در بافر تبادل را مشخص می کند

با برنامه؛

istemp بدون علامت;

– پرچم فایل موقت؛

- هنگام کار با یک فایل پرچم گذاری کنید.

) فایل؛

قبل از شروع کار با فایل، i.e. برای اینکه بتوانید اطلاعات را در یک فایل بخوانید یا بنویسید، باید برای دسترسی باز شود. برای این منظور معمولاً از تابع استفاده می شود

FILE* fopen(char* file_name، char* mode);

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

نام فیزیکی، یعنی نام فایل و مسیر دسترسی به آن با پارامتر اول مشخص می شود

- یک خط، به عنوان مثال، "a:Mas_dat.dat" - یک فایل به نام Mas_dat.dat واقع در فلاپی دیسک، "d:\\work\\Sved.txt" - یک فایل به نام Sved.txt که روی هارد قرار دارد. درایو در فهرست کار .

توجه! بک اسلش (\)، به عنوان یک کاراکتر خاص، دو بار در یک خط نوشته می شود.

پس از باز کردن موفقیت آمیز، تابع fopen یک اشاره گر را به فایل برمی گرداند (از این پس به عنوان نشانگر فایل نامیده می شود). در صورت خطا، NULL برگردانده می شود. این وضعیت معمولا زمانی رخ می دهد که مسیر فایلی که باید باز شود به اشتباه مشخص شده باشد. مثلاً اگر در کلاس نمایش دانشگاه ما مسیری را مشخص کنید که نوشتن آن ممنوع است (معمولاً d:\work\ مجاز است).

پارامتر دوم خطی است که حالت دسترسی به فایل را مشخص می کند:

w - فایل برای نوشتن باز می شود. اگر فایلی با نام داده شده وجود نداشته باشد، ایجاد خواهد شد. اگر چنین فایلی وجود داشته باشد، اطلاعات قبلی قبل از باز کردن از بین می رود.

r - فایل فقط برای خواندن باز می شود. اگر چنین فایلی وجود نداشته باشد، خطایی رخ می دهد.

الف – فایل برای افزودن اطلاعات جدید به انتها باز می شود.

r+ - فایل برای ویرایش داده ها باز می شود - هم نوشتن و هم خواندن اطلاعات امکان پذیر است.

w+ – مانند r+؛

a+ – مانند a، فقط نوشتن را می توان در هر جایی از فایل انجام داد. خواندن فایل نیز در دسترس است.

t – فایل در حالت متنی باز می شود؛ b – فایل در حالت باینری باز می شود.

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

به طور پیش فرض، فایل در حالت متنی باز می شود. مثال: FILE *f; - یک اشاره گر به فایل f اعلام شده است.

f = fopen("d:\\work\\Dat_sp.cpp"، "w"); – فایلی با نام منطقی f که دارای نام فیزیکی Dat_sp.cpp است که در درایو d در فهرست کار قرار دارد، برای نوشتن باز می شود. یا به طور خلاصه تر

FILE *f = fopen("d:\\work\\Dat_sp.cpp", "w");

18.2. بستن یک فایل

پس از کار با یک فایل، دسترسی به آن باید بسته شود. این کار توسط تابع int fclose (اشاره‌گر فایل) انجام می‌شود. به عنوان مثال، از مثال قبلی، فایل به این صورت بسته شده است: fclose (f);

برای بستن چندین فایل، یک تابع معرفی می شود که به صورت زیر اعلام می شود: void fcloseall (void);

اگر نیاز به تغییر حالت دسترسی برای یک فایل دارید، ابتدا باید فایل را ببندید و سپس دوباره باز کنید، اما با حقوق دسترسی متفاوت. برای این کار از تابع استاندارد استفاده کنید:

FILE* freopen (char*file_name، char *حالت، FILE *file_pointer);

این تابع ابتدا فایل اعلام شده را می بندد file_pointer(همانطور که تابع fopen انجام می دهد)، و سپس فایل را با نام فایل و مجوزهای "mode" باز می کند.

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

FILE* tmpfile(void);

که یک فایل موقت روی دیسک با حقوق دسترسی “w+b” ایجاد می کند؛ پس از اتمام برنامه یا پس از بسته شدن فایل موقت، به طور خودکار حذف می شود.

18.3. نوشتن – خواندن اطلاعات

تمام اقدامات برای خواندن و نوشتن داده ها در یک فایل را می توان به سه گروه تقسیم کرد: عملیات ورودی-خروجی کاراکتر به کاراکتر. عملیات ورودی/خروجی خط به خط؛ مسدود کردن عملیات I/O

بیایید به توابع اصلی مورد استفاده در هر یک از این سه گروه از عملیات نگاه کنیم.

ورودی/خروجی کاراکتر به کاراکتر

در توابع ورودی/خروجی کاراکتر به کاراکتر، یک کاراکتر از یک فایل دریافت می شود یا یک کاراکتر به یک فایل ارسال می شود:

ردیف ورودی/خروجی

توابع خط ورودی/خروجی از یک فایل یا به منتقل می شوند

مسدود کردن ورودی/خروجی

توابع Block I/O روی کل بلوک ها کار می کنند

اطلاعات:

int fread (void*p, intsize,

- n بلوک به اندازه بایت هر کدام را از فایل می خواند

int n، FILE *f)

la f به یک ناحیه حافظه با نشانگر p (الزامی است

int fwrite (void*p, intsize,

از قبل حافظه را برای خواندن بلوک اختصاص دهید)

– n بلوک به اندازه بایت را از هر کدام می نویسد

int n، FILE *f)

ناحیه حافظه با اشاره گر p به فایل f.

I/O فرمت شده توسط توابع تولید می شود.

ما قبلاً یاد گرفته ایم که چگونه اطلاعات را در یک فایل متنی بنویسیم. - اگر روش را یاد نگرفته اید، مقاله قبلی را ببینید. به تفصیل گفته و شرح داده شده است

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

#عبارتند از

int main()
{
char s1 //متغیر رشته را خواهد خواند
ifstream در ("C:\\\FromC\\myfile.txt"); //برای خواندن اطلاعات فایل را باز کنید
در >>s1 ; //خط را بخوانید
in.close() //بستن فایل

کوت<مقدار را خروجی بگیرید s1به صفحه نمایش
بازگشت 0 ;
}

در اینجا ساده ترین برنامه برای خواندن خط اول از یک فایل متنی واقع در مسیر است
C:\\\FromC\\myfile.txt –
از آنجایی که این ادامه مقاله قبلی است، تصمیم گرفتم از فایلی که در آنجا ایجاد کردیم استفاده کنم. احتمالاً نباید هیچ مشکلی در این مورد وجود داشته باشد.
اما اجازه دهید به کد بازگردیم. ابتدا فایل را برای خواندن اطلاعات از آن باز می کنیم، برای این کار از دستور استفاده می کنیم ifstreamهمانطور که من انجام دادم، نام فایل یا مسیر فایل را در پرانتز نشان می دهیم. ("C:\\\FromC\\myfile.txt");
وقتی فایلی را برای خواندن چیزی از آن باز می‌کنیم، یک متغیر شبیه به آن را اعلام می‌کنیم کاراکتر –
char s1
اکنون تنها کاری که باید انجام دهیم این است که مقدار رشته را از فایل به متغیر اختصاص دهیم. ما به عنوان یک تیم این کار را انجام می دهیم که در
به براکت های زاویه توجه کنید در >>
در واقع، همانطور که از نظرات به کد برنامه مشخص است، برای اینکه متغیر مقدار خوانده شده را به آن اختصاص دهد، باید آن را بعد از آن بنویسیم. در >>
در >>s1 ;

به نظر نمی رسد این کار دشواری باشد، به خصوص اگر قبلاً کاملاً تسلط داشته باشید و استفاده از مطالب مقاله قبلی را یاد گرفته باشید - همه چیز کاملاً یکسان است ، فقط 2 دستور متفاوت هستند.

ایجاد یک فایل و نوشتن اطلاعات C++ روی آن

جریان بیرون (نام فایل );
بیرون<< (رشته نوشته شود);
بیرون.بستن()؛
=============================

خواندن متن از یک فایل و چاپ متن روی صفحه در C++

ifstream که در (نام فایل )؛
که در>> (خواندن خط);
که در.بستن()؛(فایل را ببندید)
============================
بیایید یک برنامه ساده بنویسیم که ورودی متن را از صفحه کلید بخواند و آن را در یک فایل بنویسد:

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

int main()
{
\\ 3 خط آینده
clrscsr(); //پاک کردن صفحه نمایش

کوت<<“Wwedi pervuu stroku” ; cin >>a ; endl ;
کوت<<“Wwedi wtoruu stroku” ; cin >>b ; endl ;
کوت<<“Wwedi tretuu stroku” ; cin >>c ; endl ;
clrscr(); //

/*شروع کار با فایل*/
جریان خارج ("C:\\\FromC\\myfile.txt")؛ //باز کردن فایل برای نوشتن
بیرون<خط اول را یادداشت کنید
بیرون<خط دوم را بنویسید
بیرون<خط سوم را یادداشت کنید
out.close(); //بستن فایل

//بازنشانی متغیرها

برای (int i =0 ;i<=255 ;i ++)
(a =*"" ; b =*"" ; c =*"" ;)


ifstream در ("C:\\\FromC\\myfile.txt");
در >>a >>b >>c ; //هر خط جدید را در یک متغیر جدید می خوانیم
in.close(); //بستن فایل

/* */

برای (i =0 ;a !=*“” ;i ++)
{
اگر (i >sizeof(a)) زنگ تفريح ؛
کوت<

}
کوت<<“\n” ; \\

/* */


{
اگر (i >sizeof(b)) زنگ تفريح ؛
کوت<
}
کوت<<“\n” ; \\ مکان نما را به یک خط جدید منتقل کرد

/* */

برای (i =0 ;с !=*“” ;i ++)
{
اگر (i >sizeof(c)) زنگ تفريح ؛
کوت<<с ;
}

بازگشت 0 ;
}
===================

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

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

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

int main()
{
char a,b,c; \\ 3 خط آینده
clrscsr(); //پاک کردن صفحه نمایش

/* مقادیر متغیرها را وارد کنید*/

کوت<<“Wwedi pervuu stroku” ; cin.getline(a,sizeof(a)); endl ;
کوت<<“Wwedi wtoruu stroku” ; cin.getline(a,sizeof(b)); endl ;
کوت<<“Wwedi tretuu stroku” ; cin.getline(a,sizeof(c)); endl ;
clrscr(); //پس از وارد کردن مقادیر، صفحه نمایش پاک شد

/*شروع کار با فایل*/
جریان خارج ("C:\\\FromC\\myfile.txt")؛ //باز کردن فایل برای نوشتن
بیرون<
خط اول را یادداشت کنید
بیرون<خط دوم را بنویسید
بیرون<خط سوم را یادداشت کنید
out.close(); //بستن فایل

//بازنشانی متغیرها

برای (int i =0 ;i<=255 ;i ++)
(a =*"" ; b =*"" ; c=*"" ;)

/*ادامه کار با فایل*/

اگر جریان در ("C:\\\FromC\\myfile.txt");
in.getline(a,sizeof(a));// آ
in.getline(b,sizeof(b));// خواندن یک خط در یک متغیر ب
in.getline(c,sizeof(c)); // خواندن یک خط در یک متغیر ج
in.close(); //بستن فایل

/* نویسه به کاراکتر خط اول را می خوانیم و روی صفحه نمایش می دهیم */

برای (i =0 ;a !=*“” ;i++)
{
اگر (i >sizeof(a)) زنگ تفريح ؛
کوت<

}
کوت<<“\n” ; \\ مکان نما را به یک خط جدید منتقل کرد

/* نویسه به کاراکتر خط دوم را می خوانیم و روی صفحه نمایش می دهیم */

برای (i =0 ;b !=*“” ;i ++)
{
اگر (i >sizeof(b)) زنگ تفريح ؛
کوت<
}
کوت<<“\n” ; \\ مکان نما را به یک خط جدید منتقل کرد

/* نویسه به کاراکتر خط سوم را می خوانیم و روی صفحه نمایش می دهیم */

برای (i =0 ;с !=*“” ;i++)
{
اگر (i>sizeof (c)) زنگ تفريح ؛
کوت<<с[i];
}

getch(); \\منتظر فشردن کلید Enter باشید
بازگشت 0 ;
}
===================

این مطلب نمونه ای از خواندن شخصیت به کاراکتر اطلاعات را شرح می دهد. از آنجایی که من کار با متغیرهایی مانند کاراکتر، سپس مبتدیان ممکن است در درک کد دچار مشکل شوند. فقط نمیدونستم چه نوع کاراکترویژگی های خاصی دارد و فکر می کرد همه چیز ساده تر است. بنابراین برخی از لحظات نامفهوم برنامه فوق را می توانید در مطلب زیر بخوانید کار با کاراکتر V C++ برای مبتدیان

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

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

توجه داشته باشید:
زنگ تفريح ؛– این دستوری است که از حلقه خارج می شود. اگر شمارنده چرخه داریم برایبزرگتر از اندازه اعلام شده متغیر می شود کاراکتر،سپس به زور از حلقه خارج می شویم
!= – این شرطی است که ما گذاشتیم. این شرط با نابرابری نشان داده می شود
if(a !=b)- طوری می خواند که انگار آنا برابر ب

endl ; –این حرکت مکان نما به یک خط جدید در داخل کنسول است (تا جایی که من متوجه شدم)
این دستور شبیه به "\n"

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

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

بیایید مهمترین خواص و روش های آن را در نظر بگیریم:

    ویژگی Length: طول جریان را بر حسب بایت برمی گرداند

    ویژگی Position: موقعیت فعلی را در جریان برمی‌گرداند

    روش خواندن: داده ها را از یک فایل در یک آرایه بایت می خواند. سه پارامتر را می گیرد: int Read (آرایه بایت، int offset، int count) و تعداد بایت هایی که با موفقیت خوانده شده را برمی گرداند. در اینجا از پارامترهای زیر استفاده می شود:

    • آرایه - آرایه ای از بایت ها که داده های خوانده شده از فایل در آن قرار می گیرند

      offset نشان دهنده افست در بایت در آرایه ای است که بایت های خوانده شده در آن قرار می گیرند

      count - حداکثر تعداد بایت هایی که باید خوانده شوند. اگر تعداد بایت های فایل کمتر باشد، همه آنها خوانده می شوند.

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

    روش نوشتن: داده ها را از یک آرایه بایت در یک فایل می نویسد. سه پارامتر را می گیرد: Write (آرایه بایت، افست int، تعداد int)

    • آرایه - آرایه ای از بایت ها که از آن داده ها در فایل نوشته می شود

      offset - آفست در بایت در آرایه از جایی که بایت ها شروع به نوشتن در جریان می کنند

      count - حداکثر تعداد بایت هایی که باید نوشته شود

FileStream دسترسی فایل را در سطح بایت نشان می دهد، بنابراین، برای مثال، اگر شما نیاز به خواندن یا نوشتن یک یا چند خط در یک فایل متنی دارید، آرایه بایت باید با استفاده از روش های خاص به رشته تبدیل شود. بنابراین از کلاس های دیگر برای کار با فایل های متنی استفاده می شود.

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

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

Console.WriteLine("یک خط را برای نوشتن در فایل وارد کنید:"); string text = Console.ReadLine(); // نوشتن به فایل با استفاده از (FileStream fstream = new FileStream(@"C:\SomeDir\noname\note.txt، FileMode.OpenOrCreate)) (// تبدیل رشته به بایت آرایه بایت = System.Text.Encoding. پیش فرض. GetBytes(متن)؛ // نوشتن آرایه ای از بایت ها در فایل fstream.Write(array, 0, array.Length)؛ Console.WriteLine ("متن نوشته شده در فایل")؛ ) // خواندن از فایل با استفاده از (FileStream fstream = File. OpenRead(@"C:\SomeDir\noname\note.txt)) (// تبدیل رشته به بایت آرایه بایت = بایت جدید؛ // خواندن داده ها fstream.Read(آرایه، 0، array.Length؛ // رمزگشایی بایت ها به رشته رشته textFromFile = System.Text.Encoding.Default.GetString(آرایه)؛ Console.WriteLine("متن از فایل: (0)"، textFromFile)؛ ) Console.ReadLine() ;

بیایید به این مثال نگاه کنیم. هم خواندن و هم نوشتن از عبارت use استفاده می کنند. این عبارت را نباید با دستورالعمل use که شامل فضاهای نام در ابتدای فایل کد است، اشتباه گرفت. دستور use به شما این امکان را می دهد که یک شی را در یک بلوک کد ایجاد کنید که پس از اتمام آن متد Dispose آن شیء فراخوانی می شود و در نتیجه شی از بین می رود. در این مورد، متغیر fstream به عنوان یک شی عمل می کند.

شی fstream به دو روش مختلف ایجاد می شود: از طریق سازنده و از طریق یکی از متدهای ثابت کلاس File.

در اینجا دو پارامتر به سازنده ارسال می شود: مسیر فایل و شمارش FileMode. این شمارش حالت دسترسی به فایل را نشان می دهد و می تواند مقادیر زیر را داشته باشد:

    Append: در صورت وجود فایل، متن به انتهای فایل اضافه می شود. اگر فایل وجود نداشته باشد، ایجاد می شود. فایل فقط برای نوشتن باز می شود.

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

    CreateNew: یک فایل جدید ایجاد می شود. اگر چنین فایلی از قبل وجود داشته باشد، برنامه با خطا مواجه می شود

    Open: یک فایل را باز می کند. اگر فایل وجود نداشته باشد، یک استثنا پرتاب می شود

    OpenOrCreate: اگر فایل وجود داشته باشد، باز می شود، اگر نه، یک فایل جدید ایجاد می شود

    کوتاه کردن: اگر فایل وجود داشته باشد، بازنویسی می شود. فایل فقط برای نوشتن باز می شود.

متد استاتیک OpenRead از کلاس File یک فایل را برای خواندن باز می کند و یک شی FileStream را برمی گرداند.

سازنده کلاس FileStream همچنین دارای تعدادی اضافه بار است که به شما امکان می دهد شیء در حال ایجاد را با دقت بیشتری سفارشی کنید. تمام این نسخه ها را می توان در msdn مشاهده کرد.

هم نوشتن و هم خواندن از شیء رمزگذاری Encoding.Default از فضای نام System.Text استفاده می کنند. در این مورد از دو روش آن استفاده می کنیم: GetBytes برای گرفتن آرایه بایت از رشته و GetString برای گرفتن رشته از آرایه بایت.

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

Fstream.WriteByte(13); fstream.WriteByte(103);

سپس ممکن است در درک آن با مشکل مواجه شویم. بنابراین، کلاس های جداگانه برای کار مستقیم با فایل های متنی - StreamReader و StreamWriter طراحی شده اند.

دسترسی تصادفی به فایل ها

اغلب فایل های باینری یک ساختار خاص را نشان می دهند. و با دانستن این ساختار، می‌توانیم اطلاعات لازم را از فایل بگیریم یا برعکس، مجموعه‌ای از بایت‌ها را در مکانی خاص از فایل بنویسیم. به عنوان مثال، در فایل های wav، خود داده های صوتی از 44 بایت شروع می شوند و تا 44 بایت، متادیتاهای مختلفی وجود دارد - تعداد کانال های صوتی، فرکانس نمونه برداری و غیره.

با استفاده از متد Seek() می‌توانیم موقعیت مکان‌نمای جریان را کنترل کنیم که فایل از آنجا خوانده یا نوشته می‌شود. این روش دو پارامتر دارد: offset و position در فایل. یک موقعیت در یک فایل با سه مقدار توصیف می شود:

    SeekOrigin.Begin: ابتدای فایل

    SeekOrigin.End: انتهای فایل

    SeekOrigin.Current: موقعیت فعلی در فایل

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

بیایید به یک مثال نگاه کنیم:

با استفاده از System.IO با استفاده از System.Text. class Program ( static void Main (string args) ( string text = "hello world"؛ // نوشتن در فایل با استفاده از (FileStream fstream = new FileStream(@"D:\note.dat، FileMode.OpenOrCreate)) (/ / تبدیل رشته به بایت بایت ورودی = Encoding.Default.GetBytes(متن)؛ // آرایه ای از بایت ها را در فایل بنویسید fstream.Write(input, 0, input.Length)؛ Console.WriteLine("متن نوشته شده در فایل ")؛ // نشانگر را به انتهای فایل منتقل کنید، پنج بایت به انتهای فایل fstream.Seek(-5، SeekOrigin.End)؛ // منهای 5 کاراکتر از انتهای جریان // خواندن چهار کاراکترها از موقعیت فعلی خروجی بایت = بایت جدید؛ fstream.Read(خروجی، 0، خروجی. طول)؛ // رمزگشایی بایت ها به رشته رشته textFromFile = Encoding.Default.GetString(خروجی)، Console.WriteLine("Text از فایل: (0)"، textFromFile؛ // worl // در فایل کلمه world را با کلمه house string جایگزین کنید. replaceText = "house"؛ fstream.Seek(-5, SeekOrigin.End)؛ // منهای 5 کاراکترهای انتهای جریان ورودی = Encoding.Default.GetBytes(replaceText)؛ fstream.Write(input , 0, input.Length); // خواندن کل فایل // نشانگر را به ابتدای فایل برگردانید fstream.Seek(0, SeekOrigin.Begin); خروجی = بایت جدید. fstream.Read(خروجی، 0، خروجی. طول)؛ // رمزگشایی بایت ها به یک رشته textFromFile = Encoding.Default.GetString(output); Console.WriteLine("متن از فایل: (0)"، textFromFile); // سلام خانه ) Console.Read(); ))

خروجی کنسول:

متن نوشته شده در فایل متن از فایل: worl متن از فایل: سلام خانه

فراخوانی fstream.Seek(-5، SeekOrigin.End) مکان‌نمای جریان را به انتهای فایل‌ها به پنج کاراکتر برمی‌گرداند:

یعنی پس از نوشتن خط "hello world" در یک فایل جدید، مکان نما در موقعیت کاراکتر "w" قرار می گیرد.

پس از این، چهار بایت را می خوانیم که با کاراکتر "w" شروع می شود. در این رمزگذاری، 1 کاراکتر نشان دهنده 1 بایت است. بنابراین خواندن 4 بایت معادل خواندن چهار کاراکتر «worl» خواهد بود.

سپس دوباره به انتهای فایل می رویم و به انتهای پنج کاراکتر نمی رسیم (یعنی دوباره از موقعیت "w") و رشته "house" را می نویسیم. بنابراین رشته «خانه» جایگزین رشته «دنیا» می شود.

بستن یک موضوع

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

FileStream fstream = null; try ( fstream = new FileStream(@"D:\note3.dat", FileMode.OpenOrCreate); // عملیات با جریان ) catch(Exception ex) ( ) در نهایت ( if (fstream != null) fstream.Close() ;)

اگر از ساختار use استفاده نکنیم، باید به صراحت متد ()Close را فراخوانی کنیم: fstream.Close()

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

برای کار با فایل ها باید یک فایل هدر اضافه کنید . که در چندین کلاس تعریف شده و فایل های هدر گنجانده شده است ورودی فایل و خروجی فایل

ورودی/خروجی فایل مشابه ورودی/خروجی استاندارد است، تنها تفاوت این است که ورودی/خروجی بر روی یک فایل انجام می‌شود تا روی صفحه. اگر I/O به دستگاه های استاندارد با استفاده از اشیاء cin و cout انجام می شود، برای سازماندهی I/O فایل کافی است اشیاء خود را ایجاد کنید که می توانند مشابه عملگرهای cin و cout استفاده شوند.

برای مثال، باید یک فایل متنی ایجاد کنید و خط Working with files در C++ را در آن بنویسید. برای این کار باید مراحل زیر را انجام دهید:

  1. یک شی از کلاس ofstream ایجاد کنید ;
  2. ارتباط یک شی کلاس با فایلی که باید در آن نوشته شود.
  3. نوشتن یک خط در یک فایل؛
  4. فایل را ببندید

چرا ایجاد یک شی ofstream به جای یک شی ifstream ضروری است؟ زیرا باید در یک فایل بنویسید و اگر نیاز به خواندن داده ها از یک فایل داشتید، یک شی کلاس ifstream ایجاد می شود.

// ایجاد یک شی برای نوشتن در فایل ofstream /*object name*/; // شی از کلاس ofstream

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

خارج از جریان فاوت;

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

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

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

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

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

Fout.close(); // فایل را ببندید

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

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

Ofstream fout("cppstudio.txt"); // یک شی از کلاس ofstream ایجاد کنید و آن را با فایل cppstudio.txt مرتبط کنید

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

// file.cpp: نقطه ورودی برنامه کنسول را تعریف می کند. #include "stdafx.h" #include با استفاده از namespace std. int main(int argc, char* argv) ( ofstream fout("cppstudio.txt"); // یک شی از کلاس ofstream برای ضبط ایجاد کنید و آن را با فایل 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(LC_ALL، "rus"); // نمایش صحیح char buff سیریلیک؛ // بافر برای ذخیره سازی میانی متن خوانده شده از یک فایل ifstream fin ("cppstudio.txt") ؛ // فایل را برای خواندن fin >> باز کرد<< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку system("pause"); return 0; }

این برنامه دو راه برای خواندن از یک فایل نشان می دهد، اولی استفاده از عملیات انتقال به یک جریان، دوم استفاده از تابع getline() . در حالت اول فقط کلمه اول خوانده می شود و در حالت دوم رشته ای به طول 50 کاراکتر خوانده می شود. اما از آنجایی که کمتر از 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(LC_ALL، "rus")؛ // نمایش صحیح char buff سیریلیک؛ // بافر برای ذخیره سازی میانی متن خوانده شده از یک فایل ifstream fin ("cppstudio.doc") ; // ( شما یک نام فایل نامعتبر را وارد کرده اید) اگر (!fin.is_open()) // اگر فایل باز نباشد cout<< "Файл не может быть открыт!\n"; // сообщить об этом else { fin >> گاومیش // اولین کلمه از فایل 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 را ببینید).

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

Ofstream fout("cppstudio.txt", ios_base::app); // فایل را باز کنید تا اطلاعات به انتهای فایل اضافه شود fout.open("cppstudio.txt", ios_base::app); // فایل را برای اضافه کردن اطلاعات به انتهای فایل باز کنید

حالت های باز کردن فایل را می توان با استفاده از یک عملیات منطقی بیتی ترکیب کرد یا| به عنوان مثال: ios_base::out | ios_base::trunc - فایلی را برای نوشتن پس از پاک کردن باز می کند.

آبجکت های کلاس ofstream، وقتی با فایل ها مرتبط می شوند، به طور پیش فرض دارای حالت های باز کردن فایل هستند ios_base::out | ios_base::trunc . یعنی فایل در صورت نبودن ایجاد می شود. در صورت وجود فایل محتویات آن حذف می شود و خود فایل برای نوشتن آماده می شود. اشیاء کلاس ifstream، هنگامی که با یک فایل مرتبط می شوند، حالت پیش فرض باز کردن فایل را دارند ios_base::in - فایل فقط خواندنی باز است. به حالت باز کردن فایل، پرچم نیز می گویند؛ برای خوانایی، در آینده از این عبارت استفاده خواهیم کرد. جدول 1 همه پرچم‌ها را فهرست نمی‌کند، اما اینها باید برای شروع کافی باشند.

توجه داشته باشید که پرچم‌های ate و app از نظر توضیحات بسیار شبیه به هم هستند، هر دو نشانگر را به انتهای فایل منتقل می‌کنند، اما پرچم برنامه فقط اجازه نوشتن را به انتهای فایل می‌دهد و پرچم ate پرچم را به سادگی به انتهای فایل منتقل می‌کند. از فایل و محل نوشتن را محدود نمی کند.

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

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

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

/* نوع داده حداکثر مقدار بایت bool = 1 255.00 char = 1 255.00 short int = 2 32767.00 unsigned short int = 2 65535.00 int = 4 2147483647.00 unsigned int = 4.496 int = 4906 47. 00 بدون علامت طولانی int = 4 4294967295.00 float = 4 2147483647.00 شناور طولانی = 8 9223372036854775800.00 دو برابر = 8 9223372036854775800.00 */

چنین برنامه‌ای قبلاً در بخش توسعه داده شده بود، اما در آنجا تمام اطلاعات مربوط به انواع داده‌ها به دستگاه خروجی استاندارد خروجی می‌شد و ما باید برنامه را دوباره بسازیم تا اطلاعات در یک فایل نوشته شود. برای انجام این کار، باید فایل را در حالت نوشتن، با کوتاه کردن اولیه اطلاعات فایل فعلی باز کنید ( خط 14). هنگامی که فایل ایجاد شد و با موفقیت باز شد (خطوط 16 - 20)، به جای عبارت cout، در خط 22ما از شی fout استفاده می کنیم. بنابراین، به جای صفحه نمایش، اطلاعات نوع داده در یک فایل نوشته می شود.

// write_file.cpp: نقطه ورودی برنامه کنسول را تعریف می کند. #include "stdafx.h" #include #عبارتند از // کار با فایل های #include // دستکاری کننده های ورودی/خروجی با استفاده از فضای نام std; int main(int argc, char* argv) ( setlocale(LC_ALL, "rus"); // شی را با فایل مرتبط کنید، و فایل را در حالت نوشتن باز کنید، ابتدا تمام داده ها را از روی جریان fout ("data_types.txt" حذف کنید. "، ios_base::out | ios_base::trunc؛ اگر (!fout.is_open()) // اگر فایل باز نشد (cout<< "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение return 1; // выполнить выход из программы } fout << " data type " << "byte" << " " << " max value "<< endl // سرصفحه ستون <<"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ما به صراحت فایل را بستیم، اگرچه این کار ضروری نیست، اما یک تمرین خوب برنامه نویسی محسوب می شود. شایان ذکر است که تمام توابع و دستکاری‌کننده‌های مورد استفاده برای قالب‌بندی ورودی/خروجی استاندارد برای ورودی/خروجی فایل نیز مرتبط هستند. بنابراین، هیچ خطایی در هنگام بیانیه رخ ندادکوت با یک شی جایگزین شدمبارزه کردن

بهترین مقالات در این زمینه