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

باز کردن یک فایل ورودی داده از فایل و خروجی به فایل

کار با فایل های متنی در C++.

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

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

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

برای کار با فایل ها، ویژه انواع داده ها، تماس گرفت جریان ها. جریان ifstreamبرای کار با فایل ها در حالت خواندن و خارج از جریاندر حالت ضبط یک جریان برای کار با فایل ها در حالت نوشتن و خواندن استفاده می شود. fstream.

در برنامه های ++C، هنگام کار با فایل های متنی، لازم است کتابخانه های iostream و fstream را نیز در نظر بگیرید.

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

    یک متغیر از نوع جریان را توصیف کنید.

    خروجی اطلاعات به یک فایل

    فایل را حتما ببندید

برای قرائتداده های یک فایل متنی، باید:

    یک متغیر از نوع ifstream را توصیف کنید.

    با استفاده از تابع open یک فایل را باز کنید.

    فایل را ببندید

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

    همانطور که قبلا ذکر شد، برای شروع کار با یک فایل متنی، باید متغیری از نوع ofstream را تعریف کنید. به عنوان مثال، مانند این:

    یک متغیر F برای نوشتن اطلاعات در فایل ایجاد می شود.

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

F. open("پرونده"، حالت);

در اینجا F متغیری است که به عنوان offstream اعلام شده است،

فایل - نام کامل فایل روی دیسک،

حالت - حالت کار با فایل باز شده.

لطفا توجه داشته باشید که هنگام تعیین نام کامل فایل، باید یک اسلش دو برابر قرار دهید. به عنوان مثال، نام کامل فایل noobs.txt که در پوشه بازی در درایو D: قرار دارد باید به این صورت نوشته شود:

D:\\game\\noobs.txt.

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

ios::in - فایل را در حالت خواندن داده باز کنید، این حالت حالت پیش فرض برای جریان های ifstream است.

ios::out - باز کردن فایل در حالت نوشتن داده (در این حالت اطلاعات مربوط به فایل موجود از بین می رود)، این حالت حالت پیش فرض برای جریان های جریان است.

ios::app - یک فایل را در حالت نوشتن داده ها تا انتهای فایل باز کنید.

ios::ate - به انتهای یک فایل از قبل باز شده بروید.

ios::trunc - فایل را پاک کنید، در حالت ios::out نیز همین اتفاق می افتد.

ios::nocreate - اگر فایلی وجود ندارد، آن را باز نکنید.

ios::noreplace - فایل موجود را باز نکنید.

ممکن است پارامتر mode وجود نداشته باشد، در این صورت فایل در حالت پیش فرض برای این جریان باز می شود.

پس از باز شدن موفقیت آمیز فایل (در هر حالت)، متغیر F مقدار true و در غیر این صورت false را ذخیره می کند. با این کار صحت عملیات باز کردن فایل بررسی می شود.

با استفاده از یکی از روش های زیر می توانید یک فایل (به عنوان مثال D:\\game\\noobs.txt) را در حالت نوشتن باز کنید:

// اولین مسیر

خارج از جریان F;

F.open("D:\\game\\noobs.txt", ios::out);

//راه دوم، حالت ios::out حالت پیش فرض است

// برای جریانخارج از جریان

خارج از جریان F;

//راه سوم توصیف متغیر و نوع جریان را ترکیب می کند

//و فایل را در یک عبارت باز کنید

ofstream F("D:\\game\\noobs.txt", ios::out);

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

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

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

به عنوان مثال، برای نوشتن متغیر a در جریان F، دستور خروجی به صورت زیر خواهد بود:

برای چاپ متوالی متغیرهای b، c، d در جریان G، دستور خروجی به صورت زیر در می‌آید:

جی<

جریان با استفاده از اپراتور بسته می شود:

مثال:

یک فایل متنی D:\\game\\noobs.txt ایجاد کنید و n عدد واقعی را در آن بنویسید.

#include "stdafx.h"

#عبارتند از

#عبارتند از

#عبارتند از

با استفاده از namespace std.

int main()

setlocale (LC_ALL، "RUS");

int i, n;

دو برابر a;

// جریانی را برای نوشتن داده ها در یک فایل توصیف می کند

خارج از جریان f;

//باز کردن فایل در حالت نوشتن،

//حالتios:: بیرونبه صورت پیش فرض نصب شده است

f.open("D:\\game\\noobs.txt"، ios::out);

//تعداد اعداد واقعی را وارد کنید

کوت<<" n="; cin>> n;

//حلقه برای وارد کردن اعداد واقعی

//و آنها را در یک فایل بنویسید

برای (i=0; i

کوت<<"a=";

//شماره ورودی

cin>>a;

f<

//بستن جریان

f.close();

system("مکث");

بازگشت 0;

_______________________________________________________________

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

F.open("D:\\game\\noobs.txt", ios::in);

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

به عنوان مثال، برای خواندن از جریان F به متغیر a، دستور ورودی به شکل زیر خواهد بود:

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

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

//organize برای خواندن مقادیر از یک فایل، اجرا

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

//در این مورد F.eof() true بر می گرداند

در حالی که (!F.eof())

مثال:

اعداد واقعی در فایل متنی D:\\game\\noobs.txt ذخیره می شوند، آنها را روی صفحه نمایش می دهیم و تعداد آنها را محاسبه می کنیم.

#include "stdafx.h"

#عبارتند از

#عبارتند از

#عبارتند از

#عبارتند از

با استفاده از namespace std.

int main()

setlocale (LC_ALL، "RUS");

intn=0;

شناور a;

fstream F;

//فایل را در حالت خواندن باز کنید

F.open("D:\\game\\noobs.txt");

//اگر فایل به درستی باز شد، پس

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

//وقتی به انتهای فایل رسیدیم، در این صورت F.eof() true بر می گرداند.

در حالی که (!F.eof())

//خواندن مقدار بعدی از جریان F به متغیر a

F>>a;

// مقدار متغیر a را روی صفحه خروجی می دهد

کوت<

//تعداد اعداد خوانده شده را افزایش دهید

//بستن جریان

f.close();

// وارد کردن تعداد اعداد خوانده شده روی صفحه

کوت<<"n="<

//اگر فایل به اشتباه باز شده باشد، خروجی

//پیام هایی در مورد عدم وجود چنین فایلی

دیگر cout<<" Файл не существует"<

system("مکث");

بازگشت 0;

C++. پردازش فایل های باینری

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

به منظور. واسه اینکه. برای اینکه بنویسداده ها را در یک فایل باینری، شما نیاز دارید:

    یک متغیر فایل از نوع FAIL * را با استفاده از عبارت FILE *filename; اعلام کنید. در اینجا filename نام متغیری است که نشانگر فایل در آن ذخیره می شود.

    با استفاده از تابع fwrite اطلاعات را در یک فایل بنویسید

به منظور. واسه اینکه. برای اینکه فکر z داده های یک فایل باینری، باید:

    توصیف یک متغیر از نوع FILE *

    باز کردن فایل با تابع fopen

    بستن فایل با تابع fclose

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

برای اکتشافاتفایل، تابع fopen در نظر گرفته شده است.

FILE *fopen(const *نام فایل، const char *حالت)

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

"rb" - باز کردن فایل باینری در حالت خواندن.

"wb" - یک فایل باینری برای نوشتن ایجاد کنید. اگر وجود داشته باشد، محتویات آن پاک می شود.

"ab" - ایجاد یا باز کردن یک فایل باینری برای الحاق به انتهای فایل.

"rb+" - یک فایل باینری موجود را در حالت خواندن و نوشتن باز کنید.

"wb+" - یک فایل باینری را در حالت خواندن و نوشتن باز کنید، فایل موجود پاک می شود.

"ab+" - یک فایل باینری برای تصحیح اطلاعات موجود و افزودن اطلاعات جدید به انتهای فایل باز یا ایجاد می شود.

اگر فایل با موفقیت باز نشده باشد، تابع مقدار NULL را در متغیر فایل f برمی‌گرداند. پس از باز شدن فایل، بایت 0 آن در دسترس است، نشانگر فایل 0 است، که مقدار آن با تعداد خوانده شده (نوشته شده) بایت ها هنگام خواندن یا نوشتن، جابه جا می شود. مقدار فعلی نشانگر فایل، عدد بایتی است که عملیات خواندن یا نوشتن از آن انجام می شود.

برای بسته شدنفایل، تابع fclose در نظر گرفته شده است

int fclose(FILE *filename);

اگر فایل با موفقیت بسته شد 0 را برمی‌گرداند، در غیر این صورت NULL.

تابع حذف برای حذففایل ها.

int remove(const char *filename);

این تابع فایلی به نام filenema را از دیسک حذف می کند. فایلی که باید حذف شود باید بسته شود. اگر فایل حذف نشود، تابع مقدار غیر صفر را برمی‌گرداند.

برای تغییر نامفایل ها، تابع تغییر نام در نظر گرفته شده است:

int rename(const char *oldfilename, const char *newfilename);

پارامتر اول نام فایل قدیمی و پارامتر دوم جدید است. با تکمیل موفقیت آمیز برنامه 0 را برمی گرداند.

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

fread(void *ptr, size, n, FILE *filename);

تابع fread n عنصر با اندازه اندازه را از نام فایل در آرایه ptr می خواند. تابع تعداد عناصر خوانده شده را برمی گرداند. پس از خواندن از یک فایل، نشانگر آن با n*size بایت جابجا می شود.

در حال ضبطیک فایل باینری با استفاده از تابع fwrite انجام می شود:

fwrite(const void *ptr, size, n, FILE *filename);

تابع fwrite n عنصر با اندازه اندازه را در نام فایل از آرایه ptr می نویسد. تابع تعداد عناصر نوشته شده را برمی گرداند. پس از اینکه اطلاعات در فایل نوشته شد، نشانگر با n*size بایت جابجا می شود.

برای کنترل پایان فایلیک تابع feof وجود دارد:

int feof(FILE *نام فایل);

در صورت رسیدن به انتهای فایل، مقدار غیر صفر را برمی گرداند.

مثال:

یک فایل باینری D:\\game\\noobs.dat ایجاد کنید و یک عدد صحیح n و n عدد واقعی را در آن بنویسید.

#include "stdafx.h"

#عبارتند از

با استفاده از namespace std.

int main()

setlocale (LC_ALL، "RUS");

int n، i;

دو برابر a;

// ایجاد فایل باینری در حالت نوشتن

f=fopen("D:\\game\\noobs.dat"، "wb");

// ورودی شمارهn

کوت<<"n="; cin>>n;

fwrite(&n, sizeof(int), 1, f);

//حلقه برای وارد کردن n عدد واقعی

برای (i=0; i

//عدد واقعی بعدی را وارد کنید

کوت<<"a=";

cin>>a;

//اعداد واقعی را در فایل باینری بنویسید

fwrite(&a, sizeof(double), 1, f);

// بستن فایل

fclose(f);

system("مکث");

بازگشت 0;

مثال:

نمایش محتویات فایل باینری D:\\game\\noobs.dat ایجاد شده در کار قبلی

#include "stdafx.h"

#عبارتند از

با استفاده از namespace std.

int main()

setlocale (LC_ALL، "RUS");

int n، i;

دو برابر *a;

FILE *f; //describe متغیر فایل

//فایل باینری موجود را در حالت خواندن باز کنید

//خواندن یک عدد صحیح از فایل به متغیر n

//خروجی n به صفحه نمایش

کوت<<"n="<

//تخصیص حافظه برای آرایه ای از n عدد

a=new double[n];

//خواندن n عدد واقعی از فایل به آرایه a

//خروجی آرایه به صفحه نمایش

برای (i=0; i

کوت<

کوت<

// بستن فایل

fclose(f);

system("مکث");

بازگشت 0;

دودویی- ساختار داده متوالی، پس از باز کردن فایل، اولین بایت ذخیره شده در آن موجود است. می توانید به صورت متوالی داده ها را از یک فایل بنویسید یا بخوانید. فرض کنید باید عدد پانزدهم و سپس عدد اول را بشمارید. با دسترسی سریال، این کار را می توان به روش زیر انجام داد:

int n، i;

دو برابر a;

FILE *f;

f=fopen("D:\\game\\noobs.dat"، "rb");

برای (i=0; i<15; i++)

fclose(f);

f=fopen("D:\\game\\noobs.dat"، "rb");

fread(&a, sizeof(double), 1, f);

fclose(f);

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

int fseek(FILE *نام فایل، افست طولانی int، مبدا int);

تابع نشانگر را مطابق با مقدار مبدا و آفست افست در موقعیت فعلی فایل F تنظیم می کند. پارامتر offset برابر است با تعداد بایت هایی که نشانگر فایل نسبت به مبدا مشخص شده توسط پارامتر مبدا آفست می شود. مقدار پارامتر مبدا باید یکی از مقادیر زیر برای offset باشد که در هدر stdio.h تعریف شده است:

SEEK_SET - از ابتدای فایل؛

SEEK_CUR - از موقعیت فعلی؛

SEEK_END - از انتهای فایل.

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

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

مثال

در فایل باینری D:\\game\\noobs.dat که قبلا ایجاد شده است، بزرگترین و کوچکترین اعداد واقعی را با هم عوض کنید.

الگوریتم حل مسئله شامل مراحل زیر است:

    خواندن واقعی از یک فایل به یک آرایه a.

    در آرایه a مقادیر حداکثر (max) و حداقل (min) و اعداد آنها (imax، imin) را جستجو کنید.

    انتقال نشانگر فایل به حداکثر مقدار و نوشتن min.

    نشانگر فایل را به حداقل مقدار منتقل کنید و حداکثر را بنویسید.

در زیر متن برنامه حل مشکل با کامنت قرار داده شده است.

#include "stdafx.h"

#عبارتند از

با استفاده از namespace std.

int main()

setlocale (LC_ALL، "RUS");

int n, i, imax, imin;

double *a, max, min;

FILE *f;

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

f=fopen("D:\\game\\noobs.dat"، "rb+");

//خواندن از فایل به متغیر n عدد

//اعداد واقعی در فایل

fread(&n, sizeof(int), 1, f);

کوت<<"n="<

//تخصیص حافظه برای ذخیره اعداد واقعی،

//که در آرایه a ذخیره خواهد شد

a=new double[n];

//خواندن از فایل به یک آرایه و اعداد واقعی

fread(a, sizeof(double), n, f);

//جستجوی عناصر حداکثر و حداقل

//در آرایه a و شاخص های آنها

برای (imax=imin=0, max=min=a, i=1; i

اگر (a[i]> حداکثر)

max=a[i];

اگر (a[i]

min=a[i];

// در حال حرکت اشاره گر به بیشترین عنصر

fseek(f، sizeof(int)+imax*sizeof(double)، SEEK_SET);

//recording min به جای حداکثر عنصر فایل

fwrite(&min, sizeof(double), 1, f);

// در حال حرکت اشاره گر به کمترین عنصر

fseek(f، sizeof(int)+imin*sizeof(double)، SEEK_SET);

// رکورد حداکثر به جای حداقل عنصر فایل

fwrite(&max, sizeof(double), 1, f);

//بستن فایل

fclose(f);

// حافظه خالی

حذف[ ]آ؛

system("مکث");

فایل های متنی

بیایید کار با یک فایل متنی در C را با استفاده از یک مثال در نظر بگیریم. یک فایل متنی در درایو C به نام TextFile.txt ایجاد کنید. خطوط زیر را در این فایل تایپ کنید:

String_1 123 String_11, 456
رشته_2
رشته_3

فایل را ذخیره کنید.

و این کد برنامه C است که فایل ما را باز می کند و خطوطی را از آن می خواند:

/* *نویسنده: @author Subbotin B.P..h> #include #define LEN 50 int main(void) ( puts("عملیات فایل متنی")؛ char cArray؛ FILE *pTextFile = fopen("C:\\TextFile.txt"، "r"); if(pTextFile == NULL) ( puts("Problems"); return EXIT_FAILURE; ) while(fgets(cArray، LEN، pTextFile) != NULL) (printf("%s"، cArray); ) fclose(pTextFile)؛ بازگشت EXIT_SUCCESS؛ )

برای باز کردن یک فایل متنی در C، از تابع fopen استفاده کنید:

FILE *pTextFile = fopen("C:\\TextFile.txt"، "r");

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

ما خطوط را با استفاده از تابع fgets می خوانیم:

fgets (cArray، LEN، pTextFile)؛

آرگومان اول تابع fgets به آرایه ای از کاراکترها اشاره می کند که رشته های دریافتی در آن ذخیره می شوند، آرگومان دوم حداکثر تعداد کاراکترهایی است که باید خوانده شوند، سومین فایل ما است.

پس از اتمام کار با فایل، باید آن را ببندید:

fclose(pTextFile);

ما گرفتیم:

حروف روسی در خطوط نیز عبور می کند.

در ضمن من این برنامه رو تو اکلیپس ساختم. می توانید نحوه کار با C/C++ را در Eclipse ببینید.

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

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

/* نویسنده: @author Subbotin B.P..h> #include int main(void) ( FILE *pTextFile = fopen("C:\\TextFileW.txt"، "w"); char *cString = "این یک رشته است"؛ char cNewLine = "\n"؛ int nVal = 123 ؛ if(pTextFile == NULL) ( قرار می دهد("مشکلات")؛ بازگشت EXIT_FAILURE؛ ) fprintf(pTextFile، "%s%c"، cString، cNewLine؛ fprintf(pTextFile، "%d"، nVal)؛ بازگشت EXIT_SUCCESS ;)

یک فایل متنی ایجاد کنید تا داده ها را روی آن بنویسید:

FILE *pTextFile = fopen("C:\\TextFileW.txt"، "w");

اگر فایل از قبل وجود داشته باشد، باز می شود و تمام داده ها از آن حذف می شوند.

رشته C cString و عدد nVal توسط برنامه در یک فایل متنی نوشته می شود. cNewLine فقط یک خط شکسته است.

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

fprintf(pTextFile، "%s%c"، cString، cNewLine);

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

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

فایل یک ناحیه با نام از حافظه خارجی است که برای ذخیره آرایه ای از داده ها اختصاص داده شده است. داده های موجود در فایل ها از متنوع ترین ماهیت هستند: برنامه هایی به زبان الگوریتمی یا ماشین. داده های اولیه برای عملکرد برنامه ها یا نتایج اجرای برنامه؛ متون دلخواه; گرافیک و غیره

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

سیستم فایلبخشی کاربردی از سیستم عامل است که عملیات روی فایل ها را ارائه می دهد. نمونه هایی از سیستم های فایل عبارتند از FAT (FAT - جدول تخصیص فایل، جدول تخصیص فایل)، NTFS، UDF (مورد استفاده در سی دی ها).

سه نسخه اصلی FAT وجود دارد: FAT12، FAT16 و FAT32. آنها در بیتی بودن رکوردها در ساختار دیسک متفاوت هستند، یعنی. تعداد بیت های اختصاص داده شده برای ذخیره شماره خوشه. FAT12 عمدتا برای فلاپی دیسک (تا 4 کیلوبایت)، FAT16 برای دیسک های کوچک، FAT32 برای درایوهای فلش با ظرفیت بالا (تا 32 گیگابایت) استفاده می شود.

ساختار فایل سیستم را با استفاده از FAT32 به عنوان مثال در نظر بگیرید.

ساختار فایل FAT32

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

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

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

فایل سیستم FAT32 ساختار زیر را دارد.

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

بخش بوت با اطلاعات زیر شروع می شود:

  • EB 58 90 - شعبه و امضای بدون قید و شرط؛
  • 4D 53 44 4F 53 35 2E 30 MSDOS5.0;
  • 00 02 - تعداد بایت ها در بخش (معمولا 512)؛
  • 1 بایت - تعداد بخش ها در خوشه.
  • 2 بایت - تعداد بخش های یدکی.

علاوه بر این، بخش بوت حاوی اطلاعات مهم زیر است:

  • 0x10 (1 بایت) - تعداد جداول FAT (معمولاً 2)؛
  • 0x20 (4 بایت) - تعداد بخش های روی دیسک.
  • 0x2C (4 بایت) - شماره خوشه دایرکتوری ریشه.
  • 0x47 (11 بایت) - برچسب حجم.
  • 0x1FE (2 بایت) - امضای بخش بوت (55 AA).

بخش اطلاعات سیستم فایل شامل:

  • 0x00 (4 بایت) - امضا (52 52 61 41)؛
  • 0x1E4 (4 بایت) - امضا (72 72 41 61)؛
  • 0x1E8 (4 بایت) - تعداد خوشه های آزاد، -1 در صورت ناشناخته بودن.
  • 0x1EC (4 بایت) - تعداد آخرین خوشه ثبت شده.
  • 0x1FE (2 بایت) - امضا (55 AA).

جدول FAT حاوی اطلاعاتی در مورد وضعیت هر خوشه روی دیسک است. 2 بایت پایین جدول FAT F8 FF FF 0F FF FF FF FF را ذخیره می کند (مطابق با حالت خوشه های 0 و 1، از نظر فیزیکی وجود ندارد). علاوه بر این، وضعیت هر خوشه حاوی تعداد خوشه ای است که فایل فعلی در آن ادامه دارد یا اطلاعات زیر را شامل می شود:

  • 00 00 00 00 - خوشه رایگان است.
  • FF FF FF 0F پایان فایل فعلی است.
  • 8 بایت - نام فایل.
  • 3 بایت - پسوند فایل.

دایرکتوری ریشه شامل مجموعه ای از رکوردهای اطلاعات 32 بیتی برای هر فایل است که حاوی اطلاعات زیر است:

هنگام کار با نام فایل های طولانی (از جمله نام های روسی)، نام فایل در سیستم رمزگذاری UTF-16 کدگذاری می شود. در این حالت 2 بایت برای رمزگذاری هر کاراکتر اختصاص داده می شود. در این حالت نام فایل به شکل ساختار زیر نوشته می شود:

  • دنباله 1 بایت؛
  • 10 بایت حاوی 5 کاراکتر پایینی نام فایل است.
  • ویژگی 1 بایت؛
  • 1 بایت رزرو شده است.
  • 1 بایت - جمع کنترل نام DOS.
  • 12 بایت شامل 3 کاراکتر پایینی نام فایل است.
  • 2 بایت - تعداد اولین خوشه.
  • کاراکترهای باقی مانده از نام طولانی

کار با فایل ها در C

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

هنگامی که یک جریان برای I/O باز می شود، با ساختار استاندارد نوع FILE که در stdio.h تعریف شده است، مرتبط می شود. ساختار FILE حاوی اطلاعات لازم در مورد فایل است.

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

FILE *fopen(نام، نوع)؛


name نام فایلی است که باید باز شود (شامل مسیر)
type یک اشاره گر به رشته ای از کاراکترها است که نحوه دسترسی به فایل را مشخص می کند:
  • "r" - فایل باز برای خواندن (فایل باید وجود داشته باشد)؛
  • "w" - یک فایل خالی برای نوشتن باز کنید. اگر فایل وجود داشته باشد، محتویات آن از بین می رود.
  • "a" - باز کردن فایل برای نوشتن تا انتها (برای پیوست)؛ اگر فایل وجود نداشته باشد ایجاد می شود.
  • "r+" - فایل باز برای خواندن و نوشتن (فایل باید وجود داشته باشد).
  • "w+" - یک فایل خالی برای خواندن و نوشتن باز کنید. اگر فایل وجود داشته باشد، محتویات آن از بین می رود.
  • "a+" - فایل را برای خواندن و اضافه کردن باز کنید، اگر فایل وجود نداشته باشد، ایجاد می شود.

مقدار بازگشتی یک اشاره گر به جریان باز است. اگر خطایی پیدا شد، NULL برگردانده می شود.

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

مقدار بازگشتی: مقدار 0 اگر جریان با موفقیت بسته شد. ثابت EOF در صورت بروز خطا.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#عبارتند از
int main() (
FILE *fp;
char name = "my.txt" ;
if ((fp = fopen (نام، "r" )) == NULL)
{
printf( "فایل باز نشد");
getchar();
بازگشت 0;
}
// فایل باز شد
... // اقدامات لازم روی داده ها
fclose(fp);
getchar();
بازگشت 0;
}

خواندن یک شخصیت از یک فایل:

char fgetc(stream);


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

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

fputc (شخصیت، جریان)؛

آرگومان های تابع یک کاراکتر و یک اشاره گر به جریانی از نوع FILE هستند. تابع کد کاراکتر خوانده شده را برمی گرداند.

توابع fscanf() و fprintf() مشابه توابع scanf() و printf() هستند، اما بر روی فایل های داده کار می کنند و نشانگر فایل را به عنوان اولین آرگومان خود دارند.

fscanf(stream، "InputFormat"، args);

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

هنگامی که یک جریان برای I/O باز می شود، با ساختار استاندارد نوع FILE که در stdio.h تعریف شده است مرتبط می شود. ساختار FILE حاوی اطلاعات لازم در مورد فایل است.

باز کردن یک فایل با استفاده از تابع ()fopen انجام می شود که یک اشاره گر را به ساختاری از نوع FILE برمی گرداند که می تواند برای عملیات های بعدی با فایل استفاده شود.

FILE *fopen(نام، نوع)؛

name نام فایلی است که باید باز شود (شامل مسیر)
نوع - اشاره گر به رشته ای از کاراکترها که نحوه دسترسی به فایل را مشخص می کند:

· "r" - فایل را برای خواندن باز کنید (فایل باید وجود داشته باشد).

· "w" - یک فایل خالی برای نوشتن باز کنید. اگر فایل وجود داشته باشد، محتویات آن از بین می رود.

· "a" - باز کردن فایل برای نوشتن تا انتها (برای الحاق)؛ اگر فایل وجود نداشته باشد ایجاد می شود.

· "r+" - فایل را برای خواندن و نوشتن باز کنید (فایل باید وجود داشته باشد).

· "w+" - یک فایل خالی برای خواندن و نوشتن باز کنید. اگر فایل وجود داشته باشد، محتویات آن از بین می رود.

· "a+" - فایل را برای خواندن و اضافه کردن باز کنید، اگر فایل وجود نداشته باشد، ایجاد می شود.

مقدار بازگشتی یک اشاره گر به جریان باز است. اگر خطایی پیدا شد، NULL برگردانده می شود.

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

مقدار بازگشتی: مقدار 0 اگر جریان با موفقیت بسته شد. ثابت EOF در صورت بروز خطا.

#عبارتند از
int main()

char name="my.txt";

if(fp = fopen(name, "r")!=NULL)

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

else printf ("فایل باز نشد");

خواندن یک شخصیت از یک فایل:

char fgetc(stream);

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

fputc (شخصیت، جریان)؛

آرگومان های تابع یک کاراکتر و یک اشاره گر به جریانی از نوع FILE هستند. تابع کد کاراکتر خوانده شده را برمی گرداند.

توابع fscanf() و fprintf() مشابه توابع scanf() و printf() هستند، اما بر روی فایل های داده کار می کنند و نشانگر فایل را به عنوان اولین آرگومان خود دارند.

fscanf(جریان، "فرمت ورودی"، آرگومان ها)؛
fprintf(جریان، "فرمت خروجی"، آرگومان ها)؛

توابع fgets() و fputs() برای رشته ورودی/خروجی هستند، آنها مشابه توابع gets() و puts() برای کار با فایل ها هستند.

fgets (نشانگر به رشته، تعداد کاراکترها، جریان)؛

کاراکترها از جریان خوانده می شوند تا زمانی که یک کاراکتر خط جدید "\n" خوانده شود، که در رشته گنجانده شده است، یا تا زمانی که انتهای جریان EOF شود یا حداکثر تعداد کاراکترها خوانده شود. نتیجه در یک نشانگر رشته قرار می گیرد و با کاراکتر تهی "\0" خاتمه می یابد. تابع آدرس رشته را برمی گرداند.

fputs (نشانگر به رشته، جریان)؛

یک رشته را از موقعیت فعلی در جریان کپی می کند. کاراکتر تهی پایان کپی نشده است.
مثال یک عدد وارد کنید و آن را در فایل s1.txt ذخیره کنید. عدد را از فایل s1.txt بخوانید، آن را 3 افزایش دهید و در فایل s2.txt ذخیره کنید.

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

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

رایج ترین کلاس های مورد استفاده ifstream برای خواندن، ofstream برای نوشتن و fstream برای تغییر فایل ها هستند.

تمام کلاس‌های ورودی/خروجی رشته‌ای به‌طور غیرمستقیم از اجداد مشترک ios مشتق شده‌اند و به طور کامل عملکرد آن را به ارث می‌برند. به عنوان مثال، عضو داده شمارش شده open_mode حالت باز فایل را مشخص می کند که به صورت زیر تعریف می شود:

Enum open_mode (برنامه، باینری، داخل، خارج، ترانک، خورده)؛

در زیر مقادیر احتمالی پرچم ها و هدف آنها آورده شده است.

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

فایل ifstream; file.open("test.txt", ios::in | ios::binary);

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

فایل خارج از جریان؛ file.open("test.txt", ios::out | ios::app);

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

#عبارتند از

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

اگر (! فایل) ( // رسیدگی به خطای باز کردن فایل )

اپراتورهای گنجاندن و استخراج

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

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

همچنین می توانید یک رشته متن را به صورت قسمتی بنویسید:

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

دستور endl ورودی خط را با یک بازگشت به پایان می‌رساند:

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

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

فایل Offstream ("Temp.txt"); char buff = "آرایه متن حاوی متغیرهایی است"; int vx = 100; float pi = 3.14159; فایل<< buff << endl << vx << endl << pi << endl;

در نتیجه اجرای کد، سه خط از فایل متنی Temp.txt ایجاد می شود:

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

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

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

فایل ifstream ("Temp.txt"); char buff; intvx; floatpi; فایل >> buff >> vx >> pi;

با این حال، عملگر استخراج در اولین جداکننده (فضا، برگه یا خط جدید) که با آن مواجه می شود متوقف می شود. بنابراین، هنگام تجزیه جمله "آرایه متنی حاوی متغیرها"، فقط کلمه "Text" در آرایه buff نوشته می شود، فاصله نادیده گرفته می شود و کلمه "array" به مقدار متغیر عدد صحیح vx و کد تبدیل می شود. اجرا با نقض اجتناب ناپذیر ساختار داده ها "هیجان زده" خواهد شد. در مرحله بعد، هنگام بحث در مورد کلاس ifstream، نحوه سازماندهی صحیح خواندن فایل از مثال قبلی را نشان خواهیم داد.

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

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

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

فایل ifstream ("Temp.txt"); char buff; intvx; floatpi; file.getline(buff, sizeof(buff)); فایل >> vx >> pi:

متد getline خط اول فایل را تا آخر می خواند و عملگر >> مقادیری را به متغیرها اختصاص می دهد.

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

#عبارتند از #عبارتند از با استفاده از namespace std. int main() ( فایل جریان؛ file.open ("test.txt",ios::out|ios::app)؛ if (!file) (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 >>a; if (file2.eof()) break; کوت<< a << " "; k++; } cout << endl << "K=" << k << endl; file2.close(); cin.sync(); cin.get(); return 0; }

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

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

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

while (1) ( if (file.eof()) break؛ file.getline(str, sizeof(str))؛ cout<< str << endl; }

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

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

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

کلاس ofstream: نوشتن فایل

کلاس ofstream برای خروجی داده از جریان فایل طراحی شده است. متدهای اصلی این کلاس در زیر ذکر شده است.

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

فایل Offstream ("temp.txt"); اگر (!فایل) بازگشت; برای (int i=1; i<=3; i++) file << "Строка " << i << endl; file.close();

باینری ها

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

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

#عبارتند از #عبارتند از #عبارتند از با استفاده از namespace std. struct Notes ( // ساختار داده char نوت بوک نام; // نام کامل char تلفن; // phone int Age; // age ); int main() ( setlocale (LC_ALL، "روسی")؛ یادداشت ها Note1= ("Grozny Ioann Vasilyevich"، "نصب نشده است"، 60)؛ Notes Note2= ("Godunov Boris Fedorovich"، "095-111-2233"، 30)؛ یادداشت ها Note3= ("پیتر رومانوف"، "812-333-2211"، 20); ofstream ofile ("Notebook.dat"، ios::binary); ofile.write((char*)&Note1, sizeof ( یادداشت ها))؛ // بلوک اول ofile.write((char*)&Note2, sizeof(Notes)); // بلوک دوم ofile.write((char*)&Note3, sizeof(Notes)); / / بلوک سوم ofile. close(); // بستن فایل نوشته شده ifstream ifle("Notebook.dat", ios::binary); یادداشت ها توجه؛ // متغیر ساختاری char str؛ // بافر رشته ایستا // خواندن و نمایش خطوط در یک حلقه تا زمانی که eof while (!ifile.read((char*)&Note, sizeof(Notes)).eof()) ( sprintf(str, "%s\tBody: %s\tAge: %d" , Note.Name, Note. تلفن، توجه. سن)؛ cout<< str << endl; } ifile.close(); // закрыть прочитанный файл cin.sync(); cin.get(); return 0; }

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

کلاس fstream: دسترسی تصادفی به فایل

فرض کنید دفترچه ما 100 مدخل جمع کرده است و می خواهیم 50 را بشماریم. البته، شما می توانید یک حلقه سازماندهی کنید و تمام رکوردها را از اول تا مورد داده شده بخوانید. بدیهی است که راه حل هدفمندتر این است که نشانگر موقعیت فایل pos را مستقیماً روی ورودی 50 تنظیم کرده و آن را بخوانید:

ifstream ifile("Notebook.dat", ios::binary); int pos = 49 * sizeof(Notes); ifile seek(pos); // جستجوی 50 ورودی یادداشت ها توجه; //Notes - ساختار "رکورد" که در بالا توضیح داده شد ifile.read((char*)&Note, sizeof(Notes));

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

Offstream ofile("Notebook.dat", ios::binary | ios::ate); int pos = 49 * sizeof(Notes); ofile seekp(pos); // نت 50 را جستجو کنید Note50 = ("Yeltsin Boris Nikolaevich"، "095-222-3322"، 64); ofile.write((char*)&Note, sizeof(Notes)); // جایگزینی

اگر پرچم ios::ate (یا ios::app) را مشخص نکنید، وقتی فایل باینری Notebook.dat را باز می کنید، محتویات قبلی آن پاک می شود!

در نهایت، با استفاده از روش هایی که کلاس جریان fstream از پیشینیان خود به ارث برده است، می توان یک فایل را همزمان برای خواندن/نوشتن باز کرد. از آنجایی که کلاس fstream از istream و ostream (به ترتیب والدین ifstream و ofstream) مشتق شده است، همه روش های ذکر شده قبلاً در دسترس برنامه قرار می گیرند.

مثال زیر ورودی های اول و سوم را در فایل Notebook.dat تعویض می کند.

#عبارتند از #عبارتند از #عبارتند از با استفاده از namespace std. یادداشت‌های ساختاری (نام کاراکتر؛ تلفن کاراکتر؛ سن بین‌المللی؛ ); int main() (setlocale(LC_ALL، "روسی")؛ یادداشت ها Note1، Note3؛ // باز کردن فایل برای خواندن/نوشتن همزمان فایل fstream("Notebook.dat"، ios::binary | ios::in | ios:: out); file.seekg(2 * sizeof(Notes)); // Note3 file.read((char*)&Note3, sizeof(Notes)) را پیدا کنید و بخوانید؛ file.seekg(0); // Note1 را پیدا کنید و بخوانید file.read((char*)&Note1, sizeof(Notes)); 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::out باید در سازنده شی فایل مشخص شوند تا عملیات خواندن و نوشتن همزمان امکان پذیر باشد. در نتیجه اجرای این کد، رکوردهای اول و سوم فایل باینری Notebook.dat مبادله می شود.

مثال های اضافی در مورد موضوع وجود دارد.

برترین مقالات مرتبط