PDA

View Full Version : تابع fflush() و نحوه ی کار آن در این کد



hosseinam1370
چهارشنبه 20 اسفند 1393, 09:51 صبح
دوستان تابع fflush میآد هرچی اطلاعات رو که در داخل buffer هست رو به جایی که باید برن ، هدایت و مینویسد و حافظه رو پاک میکنه.

خوب حالا تو این کد من در فایل textt اومدم در اول hossein رو نوشتم و بعد دوباره در حالت read و write بازش کردم و test رو توش نوشتم و توسط fflush حافظه رو خالی کردم و test رو ثبت کردم در فایل.
خوب حالا که میخام اطلاعات pfile رو بریزم داخل mybuffer ، فقط ein نوشته میشه و نمیفهمم چرا کاراکترهای text نوشته نمیشه و توسط دستور puts نشون داده نمیشه.
ممنون میشم بگید که چرا این اتفاقب میافته !!! و چیو در مورد جریان بافر باید بدونم، یا چه کتابی که بتونم با اینجور چیزها آشنا بشم.
اینم کد :
#include "stdafx.h"
#include <fstream>
#include<iostream>
#include <string>
#include<stdio.h>
using namespace std;
void main()
{
char mybuffer[80];
FILE * pFile;
fopen_s (&pFile , "textt.txt","w");
fputs ("hossein",pFile);
_fcloseall();
fopen_s (&pFile , "textt.txt","r+");
if (pFile == NULL) perror ("Error opening file");
else
{
fputs ("test",pFile);

fflush (pFile); // flushing or repositioning required
fgets (mybuffer,80,pFile);
puts (mybuffer);
fclose (pFile);
}
system("pause");
}

با تشکر.

rahnema1
چهارشنبه 20 اسفند 1393, 16:49 عصر
سلام
این نکات در دستورالعمل این تابعها توضیح داده شده که هم در اینترنت موجوده و هم در استاندارد زبان موجوده
علت این که ein چاپ میشه اینه که در اون لحظه موقعیت فایل در اون مکان ( بعد از text ) قرار داره که از اونجا به بعد نوشتن و خواندن انجام میشه و موقعیت در ابتدای فایل نیست.
بحث flush هم یه قضیه جداست اگه یک فایل با + باز بشه بین یک دستور خروجی و یک دستور ورودی که بعدش میاد حتما باید از fflush یا یکی از تابعهای تعیین موقعیت مثل fseek استفاده بشه. کافیه شما fflush را کامنت کنید ببینید نتیجه خراب می شه

hosseinam1370
چهارشنبه 20 اسفند 1393, 22:15 عصر
دلیلشو که جناب rahnema گفتند و این اصلاح شدش :
با تابع rewind دوباره اشاره گر برمیگرده به اول فایل،یعنی به اولین کاراکتر فایل اشاره میکند، که کد بالا رو میشه به این شکل اصلاح کرد:
#include "stdafx.h"
#include <fstream>
#include<iostream>
#include <string>
#include<stdio.h>
using namespace std;
void main()
{
char mybuffer[80];
FILE * pFile;
fopen_s (&pFile , "textt.txt","w");
fputs ("HOSSEIN" , pFile);
_fcloseall();
fopen_s (&pFile , "textt.txt","r+");
if (pFile == NULL) perror ("Error opening file");
else
{
fputs ("test",pFile);

int i = fflush (pFile); // flushing or repositioning required
rewind(pFile);
fgets (mybuffer,80,pFile);
puts (mybuffer);
fclose (pFile);
}
system("pause");
}

با تشکر.