PDA

View Full Version : فایل های باینری توی C



hamed_abutorabi
سه شنبه 31 اردیبهشت 1387, 14:57 عصر
سلام
می خوام یه دیکشنری با زبان C درست کنم لطفا در مورد چگونگی باز کردن نوشتن وخوندن و جستجو توی فایل های باینری توضیح بدین.ممنون

Nima_NF
سه شنبه 31 اردیبهشت 1387, 22:40 عصر
از طریق جستجوی گوگل در سایت fopen را برای زبان C و ifstream - ofstream - fstream را برای زبان ++C جستجو کنید به نتایج بسیاری می رسید:

برای زبان C
C File I/O and Binary File I/O (http://www.cprogramming.com/tutorial/cfileio.html)
Random Access Files in C (http://www.oldsaybrook.k12.ct.us/HSWebsite/Class_Resources/C_rsrcs/Bin_Files_C.html)
Intro to File Input/Output in C (http://www.cs.bu.edu/teaching/c/file-io/intro/)
http://barnamenevis.org/forum/showthread.php?t=73418

برای C++
C++ File I/O - binary files using fstream (http://www.codersource.net/cpp_file_io_binary.html)
http://barnamenevis.org/forum/showthread.php?t=94404
http://barnamenevis.org/forum/showthread.php?t=97755&page=2


موفق باشید

hamed_abutorabi
چهارشنبه 01 خرداد 1387, 23:15 عصر
سلام
ممنون الان میتونم تو فایل باینری بخونم و بنویسم.ولی اگه فرض کنیم که قرار باشه دیکشنری مون قابلیت اضافه کردن کلمه رو داشته باشه حالا میتونیم بریم وسط فایل و یک کلمه رو اضافه کنیم ؟چطوری ؟
راستی دستور زیر هم درست اشاره گر فایل رو جا به جا نمیکنه:
fseek(filePointer,SEEK_SEET,0);
چطوری باید محل جاری رو تغییر داد ؟
در ضمن من دارم با C برنامه مینویسم

Nima_NF
جمعه 03 خرداد 1387, 02:13 صبح
خیر داده های جدید بر روی قبلی ها کپی می شود، پس اگر بخواهید اطلاعات جدید در جایی مابین داده های قبلی فایل وارد کنید باید تمامی داده های قبلی را شیفت بدهید که زمانبر هست و جایی برای داده های جدید باز کنید. پس بهترین راه نوشتن الگوریتمی مناسب هست تا هر کدام را درانتهای فایل بریزد و سپس با استفاده از کلیدی داده های مورد نظر را یافته و نمایش دهد.(مثلا می توانید از لیست پیوندی استفاده کنید)

به خاطر همین برای برنامه هایی مثل دیکشنری از دیتابیس ها یا XML استفاده می کنند تاکار ها راحت تر شود.

برای حرکت نیز با همان fseek با ذکر تعداد بایت مورد نظر جابجایی صورت می پذیرد، مثلا در کد زیر با SEEK_SET (یعنی از ابتدای فایل) محل جاری 8 بایت به جلو می رود:



#include<iostream>
#include<conio.h>

using namespace std;
int main()
{
FILE *fl;
char str[30] = "This a text";

fl =fopen("test.txt","r+");
fseek(fl ,8 , SEEK_SET);
fwrite(&str,sizeof(char), 30, fl);

fclose(fl);

_getch();
return 0;
}

hamed_abutorabi
جمعه 03 خرداد 1387, 23:48 عصر
خیلی ممنون از راهنمایی شما

hamed_abutorabi
شنبه 04 خرداد 1387, 23:43 عصر
سلام
من میخام برم وسط فایل و یه رکورد رو بخونم ولی نمیشه ؟:عصبانی++:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
char s[20];
}word;
int main()
{
FILE *fp;
fp=fopen("c:\\z.dat","r+");
word w;
strcpy(w.s,"hamed");
fwrite(&w,sizeof(word),1,fp);
strcpy(w.s,"reza");
fwrite(&w,sizeof(word),1,fp);
strcpy(w.s,"melGibson");
fwrite(&w,sizeof(word),1,fp);
fseek(fp,0,SEEK_SET);
fread(&w,sizeof(word),1,fp);
puts(w.s);
getch();
return 0;
}