PDA

View Full Version : کار با فایل در c++، فوری



aleshi
سه شنبه 13 اردیبهشت 1390, 12:19 عصر
سلام
یه مشکل دارم که خیلی اذیتم میکنه اگه کسی کمک کنه ممنون میشم.
یه برنامه نوشتم که توش با فایلها کار میکنه.
برنامه که برای بار اول اجرا میشه، فایل رو باز میکنه و توش اطلاعاتی رو مینویسه و فایلو میبنده و اجرا تموم میشه.
برای بار دوم که اجرا میشه و برنامه فایلو برای نوشتن باز میکنه اطلاعات جدید رو روی اطلاعات قبلی مینویسه و داده های قبلی از بین میره.
الان مشکلم اینه که من وقتی برنامه رو برای بار دوم اجرامیکنم به اطلاعاتی که قبلا وارد کردن دسترسی ندارم در حالی که اون اطلاعات برام خیلی لازمند.

و دلیل این مشکل: وقتی فایل با out باز میشه، به صورت پیش فرض از trunc برای باز کردن استفاده میکنه و trunc هم موقع باز کردن فایل کل محتویات فایلو از بین میبره. به این خاطره که همه محتویات قبلی فایل از بین میره.
راه حلش:موقع باز کردن فایل با out از مقدار پیش فرض نباید استفاده کرد.

مشکل من:نمیتونم این مقدار پیش فرضو خنثی کنم که ازش استفاده نشه

نمونه ای از برنامه .
#include <iostream>
#include <fstream>
using namespace std;

int main () {
ofstream myfile;
myfile.open ("c://a.txt", ios::out);
myfile.seekp(1);
myfile << "Writing this to a file.\n";
myfile.close();
return 0;
}
که با seekp میشه از جایی که داده ها میخوان شروع به نوشته شدن کنن، استفاده میشه. اگه آرگومانهای seek زو تغییر بدیم بیشتر مشخص میشه که اشکالش کجاست. مثلا 56 بود بشه 23 اطلاعات قبلی از بین میرن و فقط داده هایی که بار دوم ذخیره شدند تو فایل هستند.

ممنون میشم اگه کسی کمکم کنه. کارم بخاطر این کلی لنگه.
اگه بشه یه مثال کوچولو هم بزنین که ین مشکلو حل کرده باشه.

tdkhakpur
سه شنبه 13 اردیبهشت 1390, 12:37 عصر
myfile.open ("c://a.txt", ios::binary | ios::out | ios::in);

ajn1370
چهارشنبه 14 اردیبهشت 1390, 15:15 عصر
سلام
منم همین مشکلو دارم
راه حلش چیه؟

tdkhakpur
چهارشنبه 14 اردیبهشت 1390, 18:41 عصر
منم همین مشکلو دارم
راه حلش چیه؟

پست 2 رو نگاه کنید اون بالا.
یعنی پارامترها رو بصورتی که ارسال شده است استفاده کنید

shahmohammadi
چهارشنبه 14 اردیبهشت 1390, 19:07 عصر
دوست عزيز اين كار از اينكه اطلاعات قبلي فايل از بين نره جلوگيري نمي كنه.
اگه به اون ها عبارت
myfile.open ("c://a.txt", ios::app | ios::binary | ios::out | ios::in);

ajn1370
چهارشنبه 14 اردیبهشت 1390, 19:20 عصر
دوست عزيز اين كار از اينكه اطلاعات قبلي فايل از بين نره جلوگيري نمي كنه.
اگه به اون ها عبارت
myfile.open ("c://a.txt", ios::app | ios::binary | ios::out | ios::in);

الان درست شد یعنی بعد از اضافه کردن ios::app دیگه اطلاعات قبلی رو پاک نمیکنه و از اخر فایل شروع به نوشتن میکنه
ممنون
اما لازم بگم وقی ما فایل رو برای خروجی باز می کنیم دیگه نیازی به ios::out و ios::in نیست

tdkhakpur
چهارشنبه 14 اردیبهشت 1390, 20:10 عصر
دوست عزيز اين كار از اينكه اطلاعات قبلي فايل از بين نره جلوگيري نمي كنه.
app به معنی اضافه نمودن به انتهاست و به این معنی هست که بعد از باز نمودن فایل اشاره گر به انتها بره و با استفاده کاربر از فایل این مشخه از بین میره و به این معنی نیست که هر داده ای حتما به انتها افزوده بشه


اما لازم بگم وقی ما فایل رو برای خروجی باز می کنیم دیگه نیازی به ios::out و ios::in نیست

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

shahmohammadi
چهارشنبه 14 اردیبهشت 1390, 23:00 عصر
app به معنی اضافه نمودن به انتهاست و به این معنی هست که بعد از باز نمودن فایل اشاره گر به انتها بره و با استفاده کاربر از فایل این مشخه از بین میره و به این معنی نیست که هر داده ای حتما به انتها افزوده بشه
بله حرف شما رو من تاييد مي كنم. اما در روش من مي تونيم بعدا برگرديم عقب و رو قبلي ها هم بنويسيم. مشكل دوستامون اگه درست متوجه شده باشم همون مشكليه كه من قبلا داشتم. يعني نمي دونند چطور سايز فايل رو بگيرن تا به آخرش سيك كنند. منظور من از حرفي كه زدم اين بود كه اين كد شما مشكل ما رو حل نميكنه.
ممنون.