PDA

View Full Version : خواندن خط های زوج فایل



NIMA_1981
پنج شنبه 25 فروردین 1390, 14:30 عصر
سلام

دوستان یک فایل متنی دارم میخوام فقط خط های زوج رو بخونم میشه راهنمایی کنید

Salar Ashgi
پنج شنبه 25 فروردین 1390, 22:10 عصر
یک مثال خیلی ساده :


#include <fstream>
#include <string>
ifstream fin("test.txt");
string str="";
if(fin){
while(!fin.eof()){
getline(fin,str,' ');//Read line by line from file by ' ' char
}
}

با دستور getline خط به خط از فایل خوانده میشود ، حالا شما مثلا میتونید با یک Counter و افزایش اون و بررسی مقدارش هر بار در حلقه ،
خط های زوج را بخوانید .
دستور getline بالا برای حالتی نوشته شده که داده ها با کاراکتر فاصله از هم جدا شده اند .

موفق باشید ./

NIMA_1981
پنج شنبه 25 فروردین 1390, 22:35 عصر
میشه با fopen همین رو نوشت جون من تو لینوکس از این توایع fstream نمی تونم استفاده کنم

tdkhakpur
پنج شنبه 25 فروردین 1390, 23:17 عصر
میشه با fopen همین رو نوشت جون من تو لینوکس از این توایع fstream نمی تونم استفاده کنم
چرا نمیشه!
یک دونه تابع بنویسید که فایل رو بخونه و تا وقتی که به کاراکتر 10 نرسیده خوندن رو ادامه بده.
داخل برنامه اصلی با یک while بررسی کنید که به انتهای فایل نرسیده اید و داخل این حلقه تابع فوق رو صدا بزنید تا خط رو بخونه و داخل بافر قرار بده
حالا شما مثلا میتونید با یک Counter و افزایش اون و بررسی مقدارش هر بار در حلقه ،خط های زوج را بخوانید .
مثل شبه الگوریتم زیر


void getline(void *buff, FILE *fp)
{
byter ch;
int c=0;
ch = (byte)fgech(fp);
while(ch!=EOF && ch!=10) {
buf[c++] = ch;
ch = (byte)fgech(fp);
}
}
void main (void)
{
int c=0, counter=0;
FILE *fp;
byte buff[512];
fp = fopen("text.dat", "rb+);
if(fp!=NULL)
{
while(!eof(fp)){
getline((void *)buff, fp);
if(c++%2==0) counter++;
}
fclose(fp);
}
}

NIMA_1981
جمعه 26 فروردین 1390, 08:28 صبح
ممنون میشه بگید برای byte باید کدوم کتابخانه رو صدا بزنم

tdkhakpur
جمعه 26 فروردین 1390, 14:20 عصر
میشه بگید برای byte باید کدوم کتابخانه رو صدا بزنم

به جاش char رو قرار بدید.

NIMA_1981
جمعه 26 فروردین 1390, 17:46 عصر
سلام میشه این کد رو بازنگری کنید مثلااین دستور خطا میده
fgech(fp);

tdkhakpur
جمعه 26 فروردین 1390, 20:20 عصر
میشه این کد رو بازنگری کنید مثلااین دستور خطا میده


اون بالا که عرض کردیم نمونه یک شبه کد هست .
در هر صورت اون باللا خطای املایی شده به جای fgetch بنویسید fgetc.
جاهای دیگه رو با بررسی اصلاح کنید کلا دو سه تابع هست که داخل helpهمه چی در موردشون نوشته.

NIMA_1981
جمعه 26 فروردین 1390, 23:39 عصر
ببنید من این کد رو تغییر دادم اما بازم خط های زوج رو نمی خونه


#include <stdio.h>
#include <stdlib.h>

void getline(char *buff, FILE *fp2){
char ch1;
int c=0;
ch1 = fgetc(fp2);
while(ch1!=EOF && ch1!=10) {
buff[c++] = ch1;
}
ch1 = fgetc(fp2);
}
int main (){
int c=0, counter=0;
FILE *fp1;
char buff[512];
fp1 = fopen("ak.txt", "rb+");
if(fp1!=NULL){
while(fgetc(fp1)!= EOF){
getline((char *)buff, fp1);
if(c++%2==0)
counter++;
printf("%d\n",counter);
}
fclose(fp1);
}
}

tdkhakpur
شنبه 27 فروردین 1390, 00:39 صبح
کد زیر که نوشتید باعث میشه یک کاراکتر در هر اسکن خط از دست داده بشه و در کل باعث ایراد در نتیجه میشه


while(fgetc(fp1)!= EOF){

در کل برنامه زیر با تغییر در کد ارسالی شما میشه این


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
void getline(char *buff, FILE *fp2)
{
char ch1;
int c=0;
ch1 = fgetc(fp2);
while(!feof(fp2) && ch1!=10) {
buff[c++] = ch1;
ch1 = fgetc(fp2);
}
buff[c] = 0;
}
int main (void)
{
int c=0;
FILE *fp;
char buff[512];
fp = fopen("ak.txt", "rb+");
if(fp!=NULL)
{
while(!feof(fp)){
getline(buff, fp);
if(c++%2==0)
printf("\n%s", buff);
}
fclose(fp);
}
return 0;
}

NIMA_1981
شنبه 27 فروردین 1390, 00:52 صبح
من اینجوری نوشتم کار کرد -



#include <stdio.h>

int main ( void )

{
int co=0;
static const char filename[] = "test.txt";

FILE *file = fopen ( filename, "r" );

if ( file != NULL )

{

char line [ 128 ]; /* or other suitable maximum line size */



while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */

{
co++;
if (co%2==0 ){
fputs ( line, stdout ); /* write the line */
}

}

fclose ( file );

}

else

{

perror ( filename ); /* why didn't the file open? */

}

return 0;

}