PDA

View Full Version : مبتدی: چه جوری میشه از یک فایل ، یک کاراکتر یک کاراکتر خواند؟



sara alavi
جمعه 02 بهمن 1388, 23:18 عصر
سلام
چه جوری میشه از یک فایل ، یک کاراکتر یک کاراکتر خواند؟
مثلا یک سری عدد داریم داخل یک فایل(4567 23456 23456 32456 ) چه جوری میشه یک رقم یک رقم از فایل خوند؟

clover
جمعه 02 بهمن 1388, 23:42 عصر
ارقام را به صورت کاراکتر از فایل بخوانید و سپس تبدیل به عدد کنید:

char c;
for(int i = 0; i < 5; i++)
{
fscanf(f_in, "%c", &c);
printf("%d\n",(int)c - '0');
}

sara alavi
جمعه 02 بهمن 1388, 23:52 عصر
دستور printf رو میشه توضیح بدین؟

printf("%d\n",(int)c-'0');

clover
شنبه 03 بهمن 1388, 00:04 صبح
دستور printf رو میشه توضیح بدین؟
اگر اعداد را به صورت کاراکتر بخوانید باید با کد های اسکی آنها کار کنید، کد اسکی اعداد از عدد 48 برای کاراکتر '0' شروع می شود. پس با کم کردن کاراکتر '0' از کاراکتر های عددی دیگر، عدد واقعی به دست خواهد آمد.

c - '0'
حاصل را با تبدیل نوع صریح به یک عدد صحیح تبدیل میکنیم (در صورتی که این کار را انجام ندهیم در موقع لزوم به صورت ضمنی توسط کامپایلر انجام خواهد گرفت)

(int)(c - '0')
و سپس عدد حاصل را به عنوان پارامتر عددی به تابع printf ارسال می کنیم تا در خروجی چاپ شود:

printf("%d\n",(int)(c - '0'));

sara alavi
شنبه 03 بهمن 1388, 00:32 صبح
عالی بود
ممنون:لبخندساده:

sara alavi
شنبه 03 بهمن 1388, 01:51 صبح
سلام
درست اجرا نمیشه!

#include<conio.h>
#include<stdio.h>
int main()
{ clrscr();
char c;int i;
FILE *f;
f=fopen("TEST1.text","r");
for( i = 0; i < 5; i++)
{
fscanf(f, "%c", &c);
printf("%d\n",(int)c - '0');
}
getch();
return(0);
}
لطفا راهنماییم کنید

qwerty11
شنبه 03 بهمن 1388, 05:07 صبح
اشکالش کجاست !؟

sara alavi
شنبه 03 بهمن 1388, 11:10 صبح
اشکالش کجاست !؟

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

sara alavi
شنبه 03 بهمن 1388, 11:33 صبح
اعدادی که در خروجی نشون میده درست نیست،یک سری اعداد کاملا بی ربط و گاهی منفی در خروجی نمایش داده میشه.

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

#include<conio.h>
#include<stdio.h>
int main()
{
char c;
int i;
FILE *f;
clrscr();
f=fopen("test1.text","w");
fprintf(f,"12345");
fclose(f);
f=fopen("test1.text","r");
for( i = 0; i < 4; i++)
{
fscanf(f, "%c", &c);
printf("%d",(int)c - '0');
}
fclose(f);
getch();
return(0);
}

sara alavi
شنبه 03 بهمن 1388, 12:35 عصر
من با همون دستوری که گفتید یه برنامه نوشتم ولی درست اجرا نمیشه.


باید انتهای یک عدد رو تشخیص بده و اونو چاپ کنه.


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


هنگام اجرا وقتی به صفحه خروجی میره هیچ کاری نمیکنه و از صفحه هم بیرون نمیاد!


#include<conio.h>
#include<stdio.h>
int main()
{
char c,z;
int i,b,n;
char a[30000];
FILE *f;
f=fopen("TEST1.text","r");
while(b!=30)
{
fscanf(f,"%c",&z);
if(z=='\0')
b=30;
n++;
}
n=n-1;
for( i = 0; i < n; i++)
{
fscanf(f, "%c", &c);
a[n]=(int)c - '0';
n--;
}
puts(a);
getch();
return(0);
}

qwerty11
شنبه 03 بهمن 1388, 12:58 عصر
if(z=='\0')
فکر کنم منظورتون این باشه :

if(z=='\n')

بانوی ایران
شنبه 03 بهمن 1388, 13:37 عصر
فکر میکنم همون
'\0'درست باشه میخواد بررسی کنه به انتهای کاراکتر رسیده یا نه

sara alavi
شنبه 03 بهمن 1388, 13:39 عصر
همون
\0درسته(البته فکر کنم) میخواد بررسی کنه به انتهای کاراکتر رسیده یا نه



آره درسته، میخوام بررسی کنم به انتهای کاراکتر رسیده یا نه

qwerty11
شنبه 03 بهمن 1388, 13:51 عصر
چی !؟

مگه شما کاراکتر به کاراکتر نمیخونین !؟ 0\' برای انتهای رشتست. اگه کاراکتری که خوندید همون انتهای خط بود برنامتون تموم میشه.

بانوی ایران
شنبه 03 بهمن 1388, 13:56 عصر
فهمیدم مشکل چیه
شما یه بار اعدا رو میخونید و میرسید به اخر فایل
باید قبل از حلقه forاز اول فايل شروع به خوندن کنید

qwerty11
شنبه 03 بهمن 1388, 14:13 عصر
حق با بانوی ایران هستش. ضمن اینکه اون اشکالی رو هم که من گرفته بودم درسته!
اما میشه بگین چی کار کردین!؟ چرا همون موقع که میخونین نمینویسیش !؟

clover
شنبه 03 بهمن 1388, 18:33 عصر
1- در اولین اجرای حلقه while متغیر های n و b بدون مقدار هستند. به آنها مقدار اولیه بدهید.
2- برای بررسی انتهای فایل از تابع feof استفاده کنید، در صورتی که فایل شما یکی خطی باشد بررسی 'n\' نتیجه ای نخواهد داشت. اگر هم فایل چند خطی باشد خطوط بعدی خوانده نخواهند شد، '0\' مربوط به رشته هاست و در کار با fscanf کاربردی نخواهد داشت.
3- آرایه a از نوع کاراکتری تعریف شده و شما می خواهید به طور مثال عدد صحیح 5 را در خانه ای از آن بریزید که معادل کاراکتر ♣ می باشد. آرایه را از نوع عددی تعریف کنید.

برنامه اصلاح شده:

#include<conio.h>
#include<stdio.h>
int main()
{
char c;
int i, n = 0;
int a[30000] = {0};
FILE *f;

f = fopen("TEST1.text","r");

if (f == NULL)
{
printf("Error ! could not open file");
getch();
return 1;
}

while(!feof(f))
{
fscanf(f, "%c", &c);
if (c >='0' && c <= '9')
{
a[n]=(int)c - '0';
n++;
}
}
n--;
for (i = 0; i < n; i++)
printf("%d\n", a[i]);
getch();
return 0;
}
موفق باشید

sara alavi
یک شنبه 04 بهمن 1388, 22:04 عصر
سلام
از همگی ممنون
من جوابمو گرفتم:لبخندساده: