如何用C语言,读文件中某行某列的数据。

比如:有一个TXT文件,文件中有10行字母(或者数字),现在要复制第3行的第2到7个 共6个字母。请问怎么实现(最好能写成一个子程序:可读任意行任意列的数据)?要用C来实现,哪位大侠高手能帮忙实现。本人帐户分数不多了,悬赏不是很高,请谅解。
另外,请问怎么才能读某个文件夹中的所有TXT文件(这些TXT文件的名称不知道,只知道其路径),也是要用C来实现。上面一个问题最急,这个要是也能帮助解决,就太太太感激了。

#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;
}追问

谢谢。在你的程序的基础上,我基本实现了想要的两种功能。现在还有一个问题,能否帮忙解答一下:
比如说 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;
}

追问

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

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-02

    用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);
    }

第2个回答  2011-09-06
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'作为结束标志追问

谢谢你的帮忙,但现在有个小问题,
while((ch=fgetc(fp))!=EOF)
{
if(n==line)
break;
if(ch=='\n')
n++;
} 这一段,应该是以判断是否回车,来跳到指定的行。但我以此程序为基础,验证了,不能跳到指定的行。

追答

首先你要确定你的文件是人为换行的(这样存在'\n'标志)还是自动换行的(自动换行不存在‘\n’标志),如果是自动换行的,你就得知道每行存放多少字节的数据,如每行10个字节的数据,那当读到第11个字节数据时,认为这是第二行的第一个数,读到21个字节数据时就是第三行的第一个数据,这样你应该明白怎么做了吧!
上面程序只适合于人为换行的,也就是说每行必定存在‘\n’标志,如果自动换行,行数就不好确定..你把文件缩小点,行数显示就多了,文件窗口放大一些,行数显示就少了..你就无法准确定位到指定的位置了!

追问

呵呵,非常感谢。

第3个回答  2011-09-06
C的精髓→指针,会用指针就能解决了
第4个回答  2011-09-06
lseek() 可以指定行

fgets()可以读取一行
相似回答