LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3677|回复: 7

请教关于如何读取文件中某一行数据的方法

[复制链接]
发表于 2007-4-13 14:28:33 | 显示全部楼层 |阅读模式
如果我有一个文件,其内容如下
user
pass
priority
那么如果我要读取里面的某一行,该怎么来做呢?
我现在的方法是如果我要读取第二行那么我就执行两次fgets(),然后将后一次的内容返回,如果读取第三行则执行三次fgets(),然后将后一行返回.
请问还有没有什么其它更高效的方法?谢谢!
发表于 2007-4-13 14:44:59 | 显示全部楼层
如果是C++的话,好像有getline()方法.如果是C的话,是文本文件就用fscanf来读取,如果是二进制文件的话,就用fread读取.不过首先你得知道里面的数据是如何组织的.
我在C中试试你说的功能,稍后我贴上一份C所有的文件操作函数.
回复 支持 反对

使用道具 举报

发表于 2007-4-13 14:48:38 | 显示全部楼层
Post by scutan
如果我有一个文件,其内容如下
user
pass
priority
那么如果我要读取里面的某一行,该怎么来做呢?
我现在的方法是如果我要读取第二行那么我就执行两次fgets(),然后将后一次的内容返回,如果读取第三行则执行三次fgets(),然后将后一行返回.
请问还有没有什么其它更高效的方法?谢谢!


如果是你想在一开始始,跳过读取第一行,有fseek()方法的,可以用fseek移到指针记录.
具体体用是
fseek(指名名,移动长度,从哪开始),
原型:
int fseek(FILE* fp, long offset, int base);

不过注意刚在读取时的数据指针当前的位置哟!
如果是让我具体操作的话,我还要试试.
我给你一份C文件操作函数列表,马上贴上来.
回复 支持 反对

使用道具 举报

发表于 2007-4-13 14:52:16 | 显示全部楼层

C常用文件函数列表

C常用文件函数列表:

int fclose(FILE* fstream);
关闭fstream指向的文件。成功返回0,失败返回非0。

int feof(FILE *fstream);
检查fstream读写点是否在文件尾。若在,返回非0;不在,返回0。

char *fgets(char *str, int num, FILE *fstream);
从fstream中读取num-1个字符,放入str指向的数组中。成功,返回str;失败,返回NULL。

FILE *fopen(const char* fname, const char* mode);
以mode指定方式打开文件名为fname的文件。成功,返回打开文件的指针;失败,返回NULL。

int fprintf(FILE *fstream, const char *format);
在fstream指向的文件中写入format格式的字符。成功,返回写入字符数;失败,返回一个负值。

int fread(void *buf, int size, int count, FILE *fstream);
从fstream指向文件中读取大小为count字节的count个数据,放入buf指向的位置。返回实际成功读取的数据数。

int fscanf(FILE *fstream, const char* format);
在fstream指向的文件中读取format格式的数据,返回实际读取的数据数。

int fseek(FILE *fstream, long offset, long origin);
将fstream所指向文件的读写点重置。距origin代表位置offset处。成功,返回0;失败,返回非0。

int fwrite(const void *buf, int size, int count, FILE *fstream);
在fstream指向文件中写入大小为size的count个数据,从buf指向处读取。返回实际写入数据数。
参考资料:《C++:The Complete Reference》 By Herbert Schildt
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-13 14:57:52 | 显示全部楼层
嗯. 谢谢你了,我再想想怎么来解决!
回复 支持 反对

使用道具 举报

发表于 2007-4-13 17:01:42 | 显示全部楼层
Post by lewbing
C常用文件函数列表:

int fclose(FILE* fstream);
关闭fstream指向的文件。成功返回0,失败返回非0。

int feof(FILE *fstream);
检查fstream读写点是否在文件尾。若在,返回非0;不在,返回0。

char *fgets(char *str, int num, FILE *fstream);
从fstream中读取num-1个字符,放入str指向的数组中。成功,返回str;失败,返回NULL。

FILE *fopen(const char* fname, const char* mode);
以mode指定方式打开文件名为fname的文件。成功,返回打开文件的指针;失败,返回NULL。

int fprintf(FILE *fstream, const char *format);
在fstream指向的文件中写入format格式的字符。成功,返回写入字符数;失败,返回一个负值。

int fread(void *buf, int size, int count, FILE *fstream);
从fstream指向文件中读取大小为count字节的count个数据,放入buf指向的位置。返回实际成功读取的数据数。

int fscanf(FILE *fstream, const char* format);
在fstream指向的文件中读取format格式的数据,返回实际读取的数据数。

int fseek(FILE *fstream, long offset, long origin);
将fstream所指向文件的读写点重置。距origin代表位置offset处。成功,返回0;失败,返回非0。

int fwrite(const void *buf, int size, int count, FILE *fstream);
在fstream指向文件中写入大小为size的count个数据,从buf指向处读取。返回实际写入数据数。
参考资料:《C++:The Complete Reference》 By Herbert Schildt


这份翻译并不十分正确,楼主最好自己再查一下 man
回复 支持 反对

使用道具 举报

发表于 2007-4-14 01:01:44 | 显示全部楼层
可以逐字节处理,找回车,比如像这样:

while (line_want != line && c = fgetc(file) != EOF) {
    if (c == 10) line++;
    else continue;
}

随手写的,仅供参考,呵呵
回复 支持 反对

使用道具 举报

发表于 2007-4-14 01:16:33 | 显示全部楼层
Post by scutan
如果我有一个文件,其内容如下
user
pass
priority
那么如果我要读取里面的某一行,该怎么来做呢?
我现在的方法是如果我要读取第二行那么我就执行两次fgets(),然后将后一次的内容返回,如果读取第三行则执行三次fgets(),然后将后一行返回.
请问还有没有什么其它更高效的方法?谢谢!

刚才没看到你用fgets,fgets和fgetc效率上应该是差不多的……也许根本就是一样……
我觉得你用fgets没什么不好,如果有其他的方法也不一定比他好。找行号总是要对回车计数的,逃不掉的。
另外,fgets对一行长度有限制,超过你给他的size的话一行也许会被分割开当作两行,三行……你明白我的意思吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表