PDA

View Full Version : رفتن به خط بعد در نوشتن داخل فايل؟



one hacker alone
شنبه 26 فروردین 1391, 15:17 عصر
سلام

كد زير رو در نظر بگيريد


ofstream fp("c:/1.txt",ios::app,ios::binary);
fp<<str;
fp.close();


حالا وقتي str وارد فايل ميشه در خط اول ميره اگه بخوام داخل فايل يه enetr بخوره و رشته بعدي در خط بعد نوشته بشه چكار كنم؟

shahmohammadi
شنبه 26 فروردین 1391, 19:02 عصر
سلام.
fp<<endl<<str;
//or
fp<<'\n'<<str;

Ananas
شنبه 26 فروردین 1391, 22:16 عصر
سلام.
راهش همینی هست که دوستمون فرمودن ولی بعضی جاها درست کار نمیکنه اگه دیدی نشد یک راه مطمئن تر اینه که از کد عددی 13 و 10 استفاده کنی.نمیدونم چرا ولی میدونم که این دو تا کاراکتر باید پشت سر هم بیان تا کامل به خط بعد بره. مثال :

#include <tchar.h>
#include <stdio.h>


int _tmain(int argc, _TCHAR* argv[])
{
char nextline[] = {char(13) , char(10), NULL};
char * str = "MHD_1390__write in C++Builder";
printf(str);
for (int i = 0; i < 5; i++)
{
printf(nextline);
}
str = "NewLine";
printf(str);

getchar();
return 0;
}

shahmohammadi
شنبه 26 فروردین 1391, 23:11 عصر
یک راه مطمئن تر اینه که از کد عددی 13 و 10 استفاده کنی.نمیدونم چرا ولی میدونم که این دو تا کاراکتر باید پشت سر هم بیان تا کامل به خط بعد بره.
روش اول تنها زماني درست نيست كه فايل به صورت باينري باز شه.
يكي از تفاوت هاي فايل هاي باينري و متني در ويندوز و داس تعيين انتهاي خط هست. كد اسكي '\n' عدد 10 يا 0a هست. كاراكتر 10 به newline يا line feed يا lf معروف هست. وقتي اين كاراكتر در فايل هاي متني مي خاد روي ديسك ذخيره شه، پشت سرش كاراكتر 13 يا carriage return يا cr هم ذخيره مي شه. اما وقتي در فايل باينري مي خاد ذخيره شه تنها خودش ذخيره مي شه.
براي مثال در برنامه زير در فايل file.bin تنها بايتي با مقدار 0a ذخيره مي شه، اما در فايل متني 10 و 13 پشت سر هم مياند:
#include <stdio.h>
#include <conio.h>

int main()
{
FILE *fbin=fopen("file.bin","wb");
FILE *ftxt=fopen("file.txt","wt");
fprintf(fbin,"\n");
fprintf(ftxt,"\n");
fclose(fbin);
fclose(ftxt);

fbin=fopen("file.bin","rb");
ftxt=fopen("file.txt","rb");

printf("file.bin:\n");
while(!feof(fbin))
printf("%d ",getc(fbin));
printf("\nfile.txt:\n");
while(!feof(ftxt))
printf("%d ",getc(ftxt));
fclose(fbin);
fclose(ftxt);
getch();
}

Ananas
یک شنبه 27 فروردین 1391, 09:10 صبح
خیلی ممنون از توضیحاتتون.
البته همیشه با ذخیره کردن و خوندن فایل این اشکال برام پیش نمیاد. من با Memo دلفی که تو c++builder هم استفاده میشه همین مشکل رو دارم و به شخصه در کل هیچ موقع از "\n" استفاده نمی کنم چون بعضی برنامه ها یا پلاگینها یا تابع ها این قابلیت رو ندارن که همیشه "\n" رو به شکل 13 , 10 بشناسن بخاطر همین کلا دستی 13 و 10 رو می نویسم. البته شاید چون کامپوننت دلفی هست اینطوریه ولی کد 13و 10 همه جا جواب میده. یکی از دوستام برنامه ای به زبان جاوا نوشته بود که همین مشکل رو با "\n" داشت با اینکه من جاوا بلد نیستم با کمک خودش 13 و 10 رو به جای "\n" استفاده کردیم درست شد. البته نوشتنش تو c++ کمی دنگ و فنگ داره ولی تو دلفی راحت تره :

str := 'MHD_1390'#13#10'Next Line';

اگه همچین راه کوتاهی تو c++ میشناسید لطفا بگید بدردم میخوره.

shahmohammadi
یک شنبه 27 فروردین 1391, 11:26 صبح
در پست 1 چون دوستمون ios::binary رو نوشتند روش من انتهاي خط رو مشخص نمي كنه، چون فايل به صورت باينري باز شده. (اينو اول نديدم). وقتي با متن كار ميكنم بهتره فايل رو متني باز كنيم.

اين روش خوب هست؟
fp<<0x0d0a<<str;

Ananas
یک شنبه 27 فروردین 1391, 15:10 عصر
اين روش خوب هست؟
عالیه. ولی برای نوشتن تو گیومه و یا بین دوتا گیومه یا همچین چیزی هم روشی بگید خیلی خوبه.
یه چیز دیگه، خوب اینو یادم نبود امتحان کنم. تو برنامتون اینو امتحان کردم. ظاهرا مثل اینکه این هم درسته :

fprintf(fbin,"\r\n");

البته روی فایل باینری درسته 13 و 10 رو مینویسه ولی روی فایل متنی دو تا 13 مینویسه بعد 10 :

fprintf(ftxt,"\r\n");

یعنی همونطور که فرمودید یه 13 خودش اظافه میکنه.