匿名用户
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;
}
追问:
谢谢,可以实现了。我弄错的原因是没有对数组进行初始化,现在好了。谢谢各位的热心解答。