C语言读取指定行数据
请问C语言如何实现读取指定行数据?不要按行读取的方法,效率太低了。例如我有一个一万行的TXT文件,我要读取第5000行的数据,给个类似的例程就行。...
请问C语言如何实现读取指定行数据?不要按行读取的方法,效率太低了。例如我有一个一万行的TXT文件,我要读取第5000行的数据,给个类似的例程就行。
展开
展开全部
很遗憾,事实上计算机是不可能做到读取txt文件的第n行的时间复杂度为O(1)的。
因为txt文件是“顺序存储”,如图参考自《数据结构》
要读取第n行,必须找到第n-1行 => 则必须找到n-2行 … 必须找到第1行。所以读取第5000行的字符串,只能一行一行找,就好比人类看书,要看到第5000段( txt的第5000行 其实打印出来是第5000段)必须一段一段数,不然只能估计,就不准确了。
如果要以O(1)时间复杂度定位到第N“行”或第N个记录,必须用“索引存储”、“散列存储”等,如数据库文件会用这类存储。具体细节可以学《数据结构》、《数据库原理》等。
参考代码:
#include <stdio.h>
//读取filename文件(路径)、第 whichLine+1 行文本。
char * ReadSpeacialLine(char *filename, int whichLine)
{
FILE *fp;
int currentLine = 0; //当前读取的行
char strLine[1024]; //每行最大读取的字符数,可根据实际情况扩大
if ((fp = fopen(filename, "r")) == NULL) //判断文件是否存在及可读
{
printf("error!");
return NULL;
}
while (!feof(fp))
{
if (currentLine == whichLine)
{
fgets(strLine, 1024, fp); //读取一行
//printf("%s", strLine); //输出
return strLine;
}
fgets(strLine, 1024, fp); //读取一行,并定位到下一行
currentLine++;
}
fclose(fp); //关闭文件
return NULL;
}
int main() {
//注意 源代码里字符串写"\\",编译之后只是1个\,因为\是转义符号
char txtFile[] = "E:\\新建文本文档.txt";
int i = 11;
printf("第%d行\n%s", i+1
, ReadSpeacialLine(txtFile, i)); //ReadSpeacialLine返回的字符串里自带换行
getchar(); //防止结束闪退
return 0;
}
展开全部
#include <stdio.h>
#define MAXC 1024
int ReadSpeacialLine(int i)
{
char filename[] = "test.c"; //文件名
FILE *fp;
int ret=0,L;
int WhichLine=i; //指定要读取哪一行
int CurrentIndex=0; //当前读取的行
char StrLine[MAXC]; //每行最大读取的字符数,可据实际情况更改
if((fp = fopen(filename,"r")) == NULL) //打开文件
{
printf("openfile error!\n");
return ret;
}
while (1) {
if (NULL==fgets(StrLine,MAXC,fp)) break;
L=strlen(StrLine);
if ('\n'==StrLine[L-1]) {
memset(ln+L-1,0,MAXC-L+1);
CurrentIndex++;
if (WhichLine==CurrentIndex)
{
fgets(StrLine,MAXC,fp); //读取一行
printf("%s", StrLine); //输出
ret = 1;
return ret;
}
}
else{ //行内容太多StrLine会读不到行结尾的情况
CurrentIndex++;
if (WhichLine==CurrentIndex)
{
fgets(StrLine,MAXC,fp); //读取一行
printf("%s", StrLine); //输出
ret = 1;
return ret;
}
while (1) {
if (NULL==fgets(StrLine,MAXC,fp)) goto END;
L=strlen(ln);
if ('\n'==ln[L-1]) break;
}
}
}
end:
fclose(fp); //关闭文件
return ret;
}
使用fgets函数,fgets是每次读取一行。
使用memset来清除StrLine,防止上一次StrLine中的内容未清除。
满意请采纳,不懂请追问。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
坐等大佬,这个应该没有更好的方式去定位多少行吧,除非一开始加载了文件。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询