c语言怎么确定文件中指定行,如何用C语言,读文件中某行某列的数据。

匿名用户

1级

2011-09-07 回答

#include

#include

#include

int fileToFile(char *nameSrc, char *nameDes);

char * getLineBuf(int line, int col, int len, char *filename);

/**************************************************************

说明:

1.使用了内存实时分配,可以满足读取任意长度的字符

但是,需要调用时手动释放内存,否则内存泄露。

2.对中文没有判断,会出现乱码。

***************************************************************/

char * getLineBuf(int line, int col, int len, char *filename)

{

char ch;

int l = 1;

char *pT = NULL;

int i = 0;

char *pA = (char *)malloc(sizeof(char)*len+1);

memset(pA, 0x00, sizeof(char)*len+1);

FILE *fp = NULL;

if (!(fp = fopen(filename, "r")))

{

printf("打开文件失败\n");

goto End;

}

while(!feof(fp))

{

if (l == line)

{

fseek(fp, col-1, SEEK_CUR);

i = fread(pA, sizeof(char), len, fp);

if(i

{

printf("字符长度不足!");

pA[i] = '\0';

goto End;

}

if (pT = strstr(pA,"\n"))

{

printf("本行长度不足");

pA[pT-pA] = '\0';

goto End;

}

break;

}

ch = fgetc(fp);

if(ch == '\n')

{

l++;

}

}

if (l+1 < line)

{

printf("文件行数不足");

}

End:

fclose(fp);

return pA;

}

/*******************************************

说明:

1.系统命令的调用,可以查询下DOS命令的使用

2.如果需要复杂的DOS命令,可以使用字符串拼装

********************************************/

int main()

{

int i = 0;

char *s = NULL;

FILE *fp = NULL;

char filename[100];

char buf[100];

memset(buf, 0x00, sizeof(buf));

char *log = "log.txt";

//sprintf(buf, "dir /B %s > %s", "*.txt", log);//字符串拼装

//system(buf);//调用系统命令

system("dir /B *.txt > log.txt");//调用系统命令

fp = fopen(log, "r");

if (fp == NULL)

printf("文件打开失败");

while(!feof(fp))

{

fscanf(fp, "%s", filename);

printf("\n文件=%s\n", filename);

for (i=1; i<=3; i++)

{

s = getLineBuf(i, 1, 2 , filename);

printf("%s\n", s);

if (s)

{

free(s); //手动释放内存,否则内存泄露

s = NULL;

}

}

}

fclose(fp);

system("del log.txt");

return 0;

}

追问:

谢谢。在你的程序的基础上,我基本实现了想要的两种功能。现在还有一个问题,能否帮忙解答一下:

比如说 fp=fopen("123456.txt","r");这样可以打开123456.txt文件。但是因为我要从log.txt(你提供的程序得到的,里面内容是当前文件夹里所有TXT文件的名称)里提取内容(就是一个TXT名称,比如123456.txt)放到数组buff里面, fp=fopen(buff,"r");却不能打开。不知道为什么?又怎么解决?

追答:

没问题啊,你是不是数组用的不对!

int main()

{

int i = 0;

int j = 0;

char *s = NULL;

FILE *fp = NULL;

char filename[100];

char buf[100];

char fileNameArry[50][100];//假定最多只有50个文件,文件名称最长100

//实际使用的时候,可实时分配内存。

char (*p)[100];

p = fileNameArry;

memset(buf, 0x00, sizeof(buf));

char *log = "log.txt";

//sprintf(buf, "dir /B %s > %s", "*.txt", log);//字符串拼装

//system(buf);//调用系统命令

system("dir /B *.txt > log.txt");//调用系统命令

fp = fopen(log, "r");

if (fp == NULL)

printf("文件打开失败");

i= 0;

printf("----数组内容打印-文件读取前\n",fileNameArry[i]);

for (i=0; i<50; i++)

{

memset(fileNameArry[i], 0x00, 100);//初始化

printf("%d = %s \n",i+1, fileNameArry[i]);

}

printf("----文件读取\n",fileNameArry[i]);

while(!feof(fp))

{

memset(filename, 0x00, sizeof(filename));

fscanf(fp, "%s", filename);

printf("文件=%s \n", filename);

memset(*p, 0x00, sizeof(filename));

if (strlen(filename))

{

memcpy(p++, filename, sizeof(filename)-1);

//printf("%s \n", fileNameArry[j]);

j++;

}

}

fclose(fp);

printf("----数组内容打印-文件读取后\n",fileNameArry[i]);

for (i=0; i

{

printf("%d = %s \n",i+1, fileNameArry[i]);

}

p = fileNameArry;

printf("处理开始\n",fileNameArry[i]);

while(j-- > 0)

{

printf("----处理文件:%s 开始 \n", p);

for (i=1; i<=3; i++)

{

s = getLineBuf(i, 1, 4 , (char *)p);

printf("%s\n", s);

if (s)

{

free(s); //手动释放内存,否则内存泄露

s = NULL;

}

}

printf("----处理文件:%s 结束 \n\n", p);

p++;

}

system("del log.txt");

return 0;

}

追问:

谢谢,可以实现了。我弄错的原因是没有对数组进行初始化,现在好了。谢谢各位的热心解答。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值