在c 语言中,如何读取一个txt文件中的信息 ?

qinghuang 2007-10-22 11:07:09
在c语言中,如何读取一个txt文件中的信息:
要求是读取文件中的所有内容(每一行包含一个单词或者说是一个字符串),然后把它保存到数组里面,这个数据会很大,有上万行的数据;
可以用几万行的二维字符数组来存储,请问如何用程序来实现??
...全文
28280 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
firedtoad 2011-10-04
  • 打赏
  • 举报
回复
每日一帖,不忘csdn
firedtoad 2011-10-04
  • 打赏
  • 举报
回复
每日回帖,必有好报
jingtuzhong 2011-10-03
  • 打赏
  • 举报
回复
fgets函数fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。
清钟沁桐 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 m_052148 的回复:]

想问个问题,如果txt中的数据格式为:
110:220,456;678 345
那么用fread读取会依次读到110 220 456 678 345吗?
[/Quote]

fread没有格式的,全当成二进制
xihu_white 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cceczjxy 的回复:]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 100000
#define BUFLEN 1024
int main()
{
FILE *file;
char buf[BUFLEN];
int len=0,i=0;
char *array[MAXLINE];

file=fopen("test.txt","r");
if(!file)return -1;
while(fgets(buf,BUFLEN,file))
{
len=strlen(buf);
array[i]=(char*)malloc(len+1);
if(!array[i])break;
strcpy(array[i++],buf);
}

[/Quote]
#define MAXLINE 100000 这个会导致
char *array[MAXLINE] 数组太小的错误
飞哥 2007-10-23
  • 打赏
  • 举报
回复
内存调度缓慢时,问题就随之产生了


不要用这种方法,不可取
_石头_ 2007-10-23
  • 打赏
  • 举报
回复
array=(char *)malloc(sizeof(char ) * MAX_SIZE*MAX_LEN);
可以写成这样:array=(char *)malloc(sizeof(char[MAX_LEN]) * MAX_SIZE);
其余没什么问题!
qinghuang 2007-10-23
  • 打赏
  • 举报
回复
//定义文件最大有MAX_SIZE行,每行字符串的最大长度:MAX_LEN;
//读入词典lexicon.txt的程序:
void readfile()
{
FILE *fp;


char (* array)[MAX_LEN];
if(!(fp=fopen("lexicon.txt","r")))
{
printf("cann 't open the file!");
}

array=(char *)malloc(sizeof(char ) * MAX_SIZE*MAX_LEN);

fgets(array, 20,fp);
array++;


fclose(fp);
}
这样写的读文件程序对吗?

请高手帮忙指教指教。

qinghuang 2007-10-23
  • 打赏
  • 举报
回复
//定义文件最大有MAX_SIZE行,每行字符串的最大长度:MAX_LEN;
//读入词典lexicon.txt的程序:
void readfile()
{
FILE *fp;


char (* array)[MAX_LEN];
if(!(fp=fopen("lexicon.txt","r")))
{
printf("cann 't open the file!");
}

array=(char *)malloc(sizeof(char ) * MAX_SIZE*MAX_LEN);

fgets(array, 20,fp);
array++;


fclose(fp);
}
这样写的读文件程序对吗?

请高手帮忙指教师教。

tokyshow 2007-10-23
  • 打赏
  • 举报
回复
我建议使用open,fopen的速度相对比较慢,fgets每次读取一行,如果上万行的话那就需要读取上万次,其实fopen是由open包装而来的。
open是一次打开然后通过read一次性将整个文本读取进buf中,然后进行处理

int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);

int close(int fd);

open函数有两个形式.其中pathname是我们要打开的文件名(包含路径名称,缺省是认为在当前路径下面).flags可以去下面的一个值或者是几个值的组合.
O_RDONLY:以只读的方式打开文件.
O_WRONLY:以只写的方式打开文件.
O_RDWR:以读写的方式打开文件.
O_APPEND:以追加的方式打开文件.
O_CREAT:创建一个文件.
O_EXEC:如果使用了O_CREAT而且文件已经存在,就会发生一个错误.
O_NOBLOCK:以非阻塞的方式打开一个文件.
O_TRUNC:如果文件已经存在,则删除文件的内容.
前面三个标志只能使用任意的一个.如果使用了O_CREATE标志,那么我们要使用open的第二种形式.还要指定mode标志,用来表示文件的访问权限.mode可以是以下情况的组合.
-----------------------------------------------------------------
S_IRUSR 用户可以读 S_IWUSR 用户可以写
S_IXUSR 用户可以执行 S_IRWXU 用户可以读写执行
-----------------------------------------------------------------
S_IRGRP 组可以读 S_IWGRP 组可以写
S_IXGRP 组可以执行 S_IRWXG 组可以读写执行
-----------------------------------------------------------------
S_IROTH 其他人可以读 S_IWOTH 其他人可以写
S_IXOTH 其他人可以执行 S_IRWXO 其他人可以读写执行
-----------------------------------------------------------------
S_ISUID 设置用户执行ID S_ISGID 设置组的执行ID
-----------------------------------------------------------------
每个数字可以取1(执行权限),2(写权限),4(读权限),0(什么也没有)或者是这几个值的和.
比如我们要创建一个用户读写执行,组没有权限,其他人读执行的文件.设置用户ID位那么我们可以使用的模式是--1(设置用户ID)0(组没有设置)7(1+2+4)0(没有权限,使用缺省)5(1+4)即10705:
open("temp",O_CREAT,10705);
如果我们打开文件成功,open会返回一个文件描述符.我们以后对文件的所有操作就可以对这个文件描述符进行操作了.
当我们操作完成以后,我们要关闭文件了,只要调用close就可以了,其中fd是我们要关闭的文件描述符.
文件打开了以后,我们就要对文件进行读写了.我们可以调用函数read和write进行文件的读写.

ssize_t read(int fd, void *buffer,size_t count);
ssize_t write(int fd, const void *buffer,size_t count);

fd是我们要进行读写操作的文件描述符,buffer是我们要写入文件内容或读出文件内容的内存地址.count是我们要读写的字节数.
对于普通的文件read从指定的文件(fd)中读取count字节到buffer缓冲区中(记住我们必须提供一个足够大的缓冲区),同时返回count.
如果read读到了文件的结尾或者被一个信号所中断,返回值会小于count.如果是由信号中断引起返回,而且没有返回数据,read会返回-1,且设置errno为EINTR.当程序读到了文件结尾的时候,read会返回0.
write从buffer中写count字节到文件fd中,成功时返回实际所写的字节数.




cangwu_lee 2007-10-23
  • 打赏
  • 举报
回复
使用 fgets 逐行读取,应该没有问题。因为我曾经读过200+M的文件,速度都可以接受。
Aaron_Jerry 2007-10-23
  • 打赏
  • 举报
回复
百度有这道题吗?我怎么没有做到
cceczjxy 2007-10-23
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 100000
#define BUFLEN 1024
int main()
{
FILE *file;
char buf[BUFLEN];
int len=0,i=0;
char *array[MAXLINE];

file=fopen("test.txt","r");
if(!file)return -1;
while(fgets(buf,BUFLEN,file))
{
len=strlen(buf);
array[i]=(char*)malloc(len+1);
if(!array[i])break;
strcpy(array[i++],buf);
}

fclose(file);
i--;
while(i>=0&&array[i])
{
printf("%s\n",array[i]);
free(array[i--]);
}
}


这样能节省一些空间。
olla168 2007-10-23
  • 打赏
  • 举报
回复
呵呵,又是百度的笔试题,自己写的那个程序自己都觉得可笑,呵呵,真是头大啊!
_石头_ 2007-10-23
  • 打赏
  • 举报
回复
是啊!但主要是他的数据较多,ls你有没有好点的方法?
_石头_ 2007-10-22
  • 打赏
  • 举报
回复
建议:1、用fgets()来读取文件内容(一次读一行);
2、建立一个指向一维数组的指针如char (*pchr)[len] //len为每行字符串的最大长度
文件有多少行,就分配多少堆空间(数据太大,建议不要存放到栈里)譬如行数为x行:
pchr=(char * )malloc(x*len*sizeof(char ))
然后每存入一行就可以用pchr++来移动存储地址,注意不要越界就行了
如果不知道文件有多少行的话,建议用单链表。
Seu_why 2007-10-22
  • 打赏
  • 举报
回复

Example
/* FSCANF.C: This program writes formatted
* data to a file. It then uses fscanf to
* read the various data back from the file.
*/

#include <stdio.h>

FILE *stream;

void main( void )
{
long l;
float fp;
char s[81];
char c;

stream = fopen( "fscanf.out", "w+" );
if( stream == NULL )
printf( "The file fscanf.out was not opened\n" );
else
{
fprintf( stream, "%s %ld %f%c", "a-string",
65000, 3.14159, 'x' );

/* Set pointer to beginning of file: */
fseek( stream, 0L, SEEK_SET );

/* Read data back from file: */
fscanf( stream, "%s", s );
fscanf( stream, "%ld", &l );

fscanf( stream, "%f", &fp );
fscanf( stream, "%c", &c );

/* Output data read: */
printf( "%s\n", s );
printf( "%ld\n", l );
printf( "%f\n", fp );
printf( "%c\n", c );

fclose( stream );
}
}

guang2008 2007-10-22
  • 打赏
  • 举报
回复
用fp=fopen()函数以只读方式打开,用while(!feof(fp))循环判断fp是否到结尾.
读入可以用fgetc(),fgets()等
redlives 2007-10-22
  • 打赏
  • 举报
回复
用数组来存储是不现实的,因为栈空间非常有限,当然全局数组空间可以大很多,不过对于大量的数据还是力不从心
像你这么大量的数据最好分配堆的空间存储。可以试试链表,如果对效率要求较高而空间宽裕可以试试指针数组。
  • 打赏
  • 举报
回复
fgets
fget
fscanf
fread
这么多应该足够了吧
加载更多回复(2)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧