PDA

View Full Version : مشكل در خواندن از فايل



Yasersadegh
شنبه 09 خرداد 1388, 13:25 عصر
سلام خدمت دوستان عزيز
من مي خوام اطلاعاتي رو از يه فايل ساده تكست بخونم!! ساده ترين كاري كه تويه سي پلاس ميشه انجام داد رو انجام دادم ولي نمي دونم چرا تنها يه كاراكتر رو مي خونه!!!:گیج:
كد رو گذاشتم هر كس از دوستان مي دونه بگه كه مشكل كارم كجاست!!؟:متفکر:



FILE *stream;
char line[100];

if( fopen_s( &stream, "test.txt", "r" ) == 0 )
{
if( fgets( line, 100, stream ) == NULL)
printf( "fgets error\n" );
else
printf( "%s", line);
fclose( stream );
}

بعد از اجرايه اين كد تنها يك كاراكتر رو از فايل مي خونه و نمايش ميده!!
دوستان لطفا راهنمايي كنيد كه مشكل كار كجاست!!؟:لبخندساده:

Nima_NF
شنبه 09 خرداد 1388, 15:57 عصر
مشکی وجود ندارد، برنامه شما به درستی عمل می کند.

فقط دقت داشته باشید که تابع fgets یک خط از کدها شما را می خواند نه تمام آن را و البته تا تعداد کارکترهای مشخص شده (برای شما 100 کارکتر)
پس موضوع بر می گردد به متنی که در فایل txt نوشته اید و به این شکل حتما باید ascii باشد نه یونیکد.

Yasersadegh
شنبه 09 خرداد 1388, 16:14 عصر
ممنون دوست عزيز
ولي فايل متني من كاملا ASCII است و هيچ كاراكتر يونيكدي در اون وجود نداره و به انتهاي خط هم نمي رسه و تنها از خط اول يك كاراكتر را مي خواند.!!نمي دونم چرا!!؟:گیج:
ولي خوب دوست عزيز پيشنهاد شما برايه اينكار چيه!!؟ من از چه تابعي استفاده كنم تا بتونم به راحتي يك تعداد كاراكتر مشخص مثلا 1كيلو بايت يا 1024 بايت از يك فايل رو بخونم و در يك بافر قرار بدم و ضمن اينكه دفعه بعد بتونم از ادامه جايه قبلي دوباره 1 كيلو بايت بعدي رو بخونم!!
من از چه تابعي استفاده كنم بهتره!!؟:متفکر:

Nima_NF
شنبه 09 خرداد 1388, 18:34 عصر
برای این کار می توانید از خواندن به شکل باینری استفاده کنید:



char *PtoStruct ;
PtoStruct = new char[1025];

fstream myFile;
myFile.open("C:\\test.txt",ios::in | ios::binary);
myFile.read(PtoStruct, 1024);

PtoStruct[ myFile.gcount() ] = '\0';

// Next time move to 1024
myFile.seekg(1024);

// then read from byte 1024 to ....

با seekg می توانید هر وقت که خواستید اشاره گر خواندن را حرکت دهید.
ضمنا ممکن هست فایل شما خیلی کمتر از 1024 بایت داشه باشد، پس اگر به شکل خطی نمی خوانید و باینری می خوانید، ابتدا باید تعداد کارکتر ها را بدست آورید(حجم فایل) سپس با توجه به آن بخوانید. مثلا در فایل که 100 کارکتر دارد خودتان باید دقت کنید و بعد از خواندن از فایل، کارکتر 101 را NULL قرار دهید (همان 0\)
برای امنیت بیشتر در ویندوز از _Read_s استفاده کنید.

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

Yasersadegh
شنبه 09 خرداد 1388, 19:01 عصر
ممنون
ولي استاد گرامي من برايه fstream از چه هدري بايد استفاده كنم!!؟:متفکر:
ضمنا اگر بخوام كه از يه فايلي كه به شكل يونيكد هست بخونم بايد چه كار كنم!!؟

tdkhakpur
شنبه 09 خرداد 1388, 19:14 عصر
سلام
اگه شما هنوز کدهایی را که آقای نیما برای شما توضیح دادن رو هنوز مطالعه نکردید کد زیر همون کار شما رو انجام میده.


FILE *stream;
char line[100];
int c;// تعداد کاراکترهای خوانده شده
stream = fopen( "test.txt", "rb" ) ;
memset(line, 0, 100);
if( stream!=NULL )
{
if( fread(line, 100, 1, stream) == 0)
printf( "fgets or reading file error\n" );
else
printf( "%s", line);
fclose( stream );
}


در بالا برای
memset(line, 0, 100);
قرار داده شده و اون هم دلیلش اینه فایل شما یک فایل متنی هست امکان برگشت داده ها بصورت فرمت رشته رو ندارد.
موفق باشید.

Yasersadegh
شنبه 09 خرداد 1388, 19:21 عصر
دوستان لطفا يه راهنمايي هم در مورد فايلهاي يونيكد بفرماييد!! ممنون!!:خجالت:

pariseiran
دوشنبه 11 خرداد 1388, 12:39 عصر
سلام منم يه مشكل كوچولو دارم يه برنامه 118 نوشتم بچه ها اطلاعات رو درج ميكنم تو حذف رو به كلي تو c++ يادم رفته چه طوري هست ميخوام يه شماره تلفن يا فاميلي بگيره مشخصات اون فرد رو حدف كنه كد كل برنامه رو ميزارم دوست اين كامل كار ميكنه
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include<conio.h>
void insert ();
void search ();
void del(void);
void list(void);
//************************************************** ****************//
struct {
char name[20];
char lastname[20];
char phone[15];
char address[50];
}tel[100];
//************************************************** ****************//
void main()
{
int key;
clrscr();


cout<<"\n\n\t نرم افزار مديريت تلفن ها 118!\n\n";
cout<<"\n\n\t كاربر عزيز خوش آمديد !\n\n";
cout<<"\n\n\t نوشته شده توسط:حميد رضا اميركياني !\n\n";
gotoxy(25,44);
cout<<"Press any key to exit!";
getch();
clrscr();
cout<<"\t Please select and choice number !\n\n";
cout<<"\t1.Insert In the list !\n\n";
cout<<"\t2.Search In the list !\n\n";
cout<<"\t3.View all of the list !\n\n";
cout<<"\t4.Exit !\n\n=>";
cin>>(key);
while(key!=4){

switch(key){
case 1:
insert(); break;
case 2:
search();break;
case 3:
list();break;
default:

cout<<"\n\nBad command !!";
}
clrscr();
cout<<"\r Press any key to select \n";
cout<<"\r 1.Insert In the list !\n\n";
cout<<"\r 2.Search In the list !\n\n";
cout<<"\r 3.View all of the list !\n\n";
cout<<"\r 4.Exit !\n\n=>";
cin>>(key);
}
}
//************************************************** ****************//
void insert ()
{
int i=0;
FILE *telph;
clrscr();
telph=fopen("d:\\tel.txt","a");

if(telph==NULL){puts("Can not open the file");return;}
puts("\n Enter 'end' to exit"
"\n--------------------");
cout<<"\nName :";
cin>>(tel[i].name);

while(strcmp(tel[i].name,"end"))
{
cout<<"\nLast Name :";
cin>>(tel[i].lastname);
cout<<"\nPhone Number :";
cin>>(tel[i].phone);
cout<<"\nAddress :";
cin>>(tel[i].address);
fwrite(&tel,sizeof tel[i],1,telph);
cout<<"\nName :";
i++;
cin>>(tel[i].name);
}
fclose(telph);
gotoxy(25,44);
cout<<"Press any key to exit!";

getch();
}
//************************************************** ***************//
void list(void)
{
int i=0;
FILE *telph;
clrscr();
telph=fopen("d:\\tel.txt","a+t");
if(telph==NULL){puts("Can not open the file");return;}
puts("\n LastName Name Number Address"
"\n-----------------------------------------------------------------------\n");
while(fread(&tel,sizeof tel[i],1,telph))
{
cout<<"\n" <<" name: "<<tel[i].lastname<<" family: "<<tel[i].name<<" tell: "<<tel[i].phone<<" adress: "<<tel[i].address;
}
gotoxy(25,44);
cout<<"Press any key to exit!";
getch();
}
//************************************************** *******************//
void search (void)
{
int i=0;
char nam[50];
FILE *telph;
clrscr();
telph=fopen("d:\\tel.txt","a+t");
if(telph==NULL){puts("Can not open the file");return;}
cout<<"\n ** Welcom To Phone Information **\n";
cout<<"\n ** Please enter the family for searching:>!\n";
cin>>(nam);
cout<<"\nLast Name\tName\tPhone No\tAddress";
cout<<"\n ?????????????????????????????????????????????????? ?????????????????????????????\n";
while(fread(&tel[i],sizeof tel[i],1,telph))
{
if(strcmp(tel[i].lastname,nam)==0)
cout<<"\n"<<tel[i].lastname<<"\t"<<tel[i].name<<"\t"<<tel[i].phone<<"\t"<<tel[i].address;
i++;
}
gotoxy(25,44);
cout<<"Press any key to exit!";

getch();
}
/************************************************** *****************/

pariseiran
دوشنبه 11 خرداد 1388, 12:41 عصر
راستي يادم رفت ميشه كاري كرد كه تو قسمت سرچ وقتي كامه "ع" رو وارد ميكنيم هر چي نام خوانوادگي با ع هست ليست بشه؟؟؟من سرچ ساده رو نوشتم كسي اگه به اين شكل بلده به ما هم ياد بده ممنون ميشم كد رو بزارين دوست عزيزم كه تو خوندن فايل هم مشكل داشت ميتونه از اين استفاده كنه قسمت سرچ و ويو از فايل ميخونه هر جا رو متوجخ نشدي توضيح ميدم بهت

tdkhakpur
دوشنبه 11 خرداد 1388, 14:26 عصر
سلام
در مورد سرچ به روشی که شما میگویید برنامه لازمه و فکر کنم کارش از برنامه جاری برای شما سخت باشه .
ولی در مورد سوال اولتون برای خذف رکورد یک فیلد به ساختارتون اضافه میکنم میتونید با set و getکردن این فیلدمشخص کنید که کدام رکورد شما حذف شده است یا نه.


struct {
char name[20];
char lastname[20];
char phone[15];
char address[50];
char Status; // اگه صفر باشه این رکورد حذف شده و در غیر اینصورت موارد دیگر
}tel[100];