如何用C语言,读文件中某行某列的数据。
比如:有一个TXT文件,文件中有10行字母(或者数字),现在要复制第3行的第2到7个共6个字母。请问怎么实现(最好能写成一个子程序:可读任意行任意列的数据)?要用C来实现...
比如:有一个TXT文件,文件中有10行字母(或者数字),现在要复制第3行的第2到7个 共6个字母。请问怎么实现(最好能写成一个子程序:可读任意行任意列的数据)?要用C来实现,哪位大侠高手能帮忙实现。本人帐户分数不多了,悬赏不是很高,请谅解。
另外,请问怎么才能读某个文件夹中的所有TXT文件(这些TXT文件的名称不知道,只知道其路径),也是要用C来实现。上面一个问题最急,这个要是也能帮助解决,就太太太感激了。 展开
另外,请问怎么才能读某个文件夹中的所有TXT文件(这些TXT文件的名称不知道,只知道其路径),也是要用C来实现。上面一个问题最急,这个要是也能帮助解决,就太太太感激了。 展开
5个回答
展开全部
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
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<len)
{
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;
}
#include <string.h>
#include <stdlib.h>
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<len)
{
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 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;
}
展开全部
用fgets函数可以读取文件中某行的数据,某列数据就必须一个一个读入每行的第几个字符,再存入到一个字符串当中。
例程:
#include<stdio.h>
#include<string.h>
void main()
{
char a[100],b[100],c[100];
int i=3,j=4,k=0; //第三行,第四列
FILE *fp = fopen("data.txt","r");
while(fgets(c,100,fp)){ //读入每行数据
i--;
if(i==0) strcpy(a,c); //读到第三行数据
b[k++]=c[j-1]; //把每行的那列字符拷到b中
}
b[k]=0;
printf("第%d行数据:%s\n",i,a);
printf("第%d列数据:%s\n",j,b);
fclose(fp);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char *read_date(int line,int row,int read_num,char *addr)
{
char date[10];
char ch;
int n=1;
FILE *fp;
if((fp=fopen(addr,"r"))==0)
{
printf("文件打开失败!");
return;
}
else
{
while((ch=fgetc(fp))!=EOF)
{
if(n==line)
break;
if(ch=='\n')
n++;
}
}
n=0;
fseek(fp,row-2,SEEK_CUR);
ch=fgetc(fp);
while((ch!=EOF)&&(n<read_num))
{
date[n]=ch;
ch=fgetc(fp);
n++;
}
date[n]='\0';
return date;
}
参数line:你要读的文件的第几行
参数row:你要读文件的第几列
参数read-num:你要读的字符个数
参数addr:对应文件的地址(如c:\\a.txt)
函数返回:存放你读的数据,以'\0'作为结束标志
{
char date[10];
char ch;
int n=1;
FILE *fp;
if((fp=fopen(addr,"r"))==0)
{
printf("文件打开失败!");
return;
}
else
{
while((ch=fgetc(fp))!=EOF)
{
if(n==line)
break;
if(ch=='\n')
n++;
}
}
n=0;
fseek(fp,row-2,SEEK_CUR);
ch=fgetc(fp);
while((ch!=EOF)&&(n<read_num))
{
date[n]=ch;
ch=fgetc(fp);
n++;
}
date[n]='\0';
return date;
}
参数line:你要读的文件的第几行
参数row:你要读文件的第几列
参数read-num:你要读的字符个数
参数addr:对应文件的地址(如c:\\a.txt)
函数返回:存放你读的数据,以'\0'作为结束标志
更多追问追答
追问
谢谢你的帮忙,但现在有个小问题,
while((ch=fgetc(fp))!=EOF)
{
if(n==line)
break;
if(ch=='\n')
n++;
} 这一段,应该是以判断是否回车,来跳到指定的行。但我以此程序为基础,验证了,不能跳到指定的行。
追答
首先你要确定你的文件是人为换行的(这样存在'\n'标志)还是自动换行的(自动换行不存在‘\n’标志),如果是自动换行的,你就得知道每行存放多少字节的数据,如每行10个字节的数据,那当读到第11个字节数据时,认为这是第二行的第一个数,读到21个字节数据时就是第三行的第一个数据,这样你应该明白怎么做了吧!
上面程序只适合于人为换行的,也就是说每行必定存在‘\n’标志,如果自动换行,行数就不好确定..你把文件缩小点,行数显示就多了,文件窗口放大一些,行数显示就少了..你就无法准确定位到指定的位置了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C的精髓→指针,会用指针就能解决了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
lseek() 可以指定行
fgets()可以读取一行
fgets()可以读取一行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询