C语言读取指定行数据

请问C语言如何实现读取指定行数据?不要按行读取的方法,效率太低了。例如我有一个一万行的TXT文件,我要读取第5000行的数据,给个类似的例程就行。... 请问C语言如何实现读取指定行数据?不要按行读取的方法,效率太低了。例如我有一个一万行的TXT文件,我要读取第5000行的数据,给个类似的例程就行。 展开
 我来答
弈轩
2018-09-21 · 知道合伙人教育行家
弈轩
知道合伙人教育行家
采纳数:1029 获赞数:7544
电子设计大赛三等奖 优秀毕业生

向TA提问 私信TA
展开全部

很遗憾,事实上计算机是不可能做到读取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;
}
一顿能吃五碗饭8
2018-09-21 · TA获得超过1671个赞
知道小有建树答主
回答量:219
采纳率:60%
帮助的人:49.9万
展开全部
#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中的内容未清除。

满意请采纳,不懂请追问。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mqcake
2018-09-21 · TA获得超过218个赞
知道小有建树答主
回答量:694
采纳率:0%
帮助的人:236万
展开全部
坐等大佬,这个应该没有更好的方式去定位多少行吧,除非一开始加载了文件。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式