第一种方法:
1.网上流行的一个方法: 打印出每行的文本信息。
#include <stdio.h> #include <stdlib.h> int main(void) { FILE * fp; char * line = NULL; size_t len = 0; ssize_t read; fp = fopen("test.txt", "r"); if (fp == NULL) exit(EXIT_FAILURE); while ((read = getline(&line, &len, fp)) != -1) { printf("Retrieved line of length %zu :\n", read); printf("%s", line); } if (line) free(line); exit(EXIT_SUCCESS); }
2.我自己稍作修改,取得指定行数的文本信息。
#include <stdio.h> #include <stdlib.h> int get_file_line(char *pInputName, char *pOutputBuf, int cnt) { FILE * fp; int i=0; char * line = NULL; size_t len = 0; ssize_t read; fp = fopen(pInputName, "r"); if (fp == NULL) return -1; if(cnt<=0) return -2; while ((read = getline(&line, &len, fp)) != -1) { ++i; if(i>=cnt) break; } if (line) { memcpy(pOutputBuf,line,strlen(line)); free(line); return 0; } return -3; } int main(void) { char name[20]="test.txt"; char buf[256]={0}; int j; for(j=1;j<8;++j) { memset(buf,0,256); get_file_line(name,buf,j); printf("[%d] == %s",j,buf); } printf("\n"); }
执行以下,结果如图:
在此处做一个小小的拓展,就是在每行的文本信息中提取我们想要的信息:
#define dIndexName "WWW" #define NAME_LEN_MAX 7 void GetName(void) { int i; char *p=NULL; char line[30]={0}; char dest_name[20]={0}; char pFileName[256]="test.txt"; get_file_line(pFileName,line,1); printf("line === %s \n",line); if((p=strstr(line,dIndexName))&&(p=strchr(line,':'))) { memcpy(dest_name,p+1,NAME_LEN_MAX); } for(i=0;i<NAME_LEN_MAX;++i) { printf("[%d] === %c \n",i,dest_name[i]); } }
执行结果,如下所示:
第二种方法:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> typedef unsigned char u8; int get_file_line(char *pInputName, int line) { char pTempString[256]; u8 *pTempBuffer; int tTempFile,tTempFileLen; int i,m,n; u8 tTempFlag,tTempCmdFlag; { tTempFile=open(pInputName,O_RDONLY); if(tTempFile>=0) { tTempFileLen=lseek(tTempFile,0,SEEK_END); lseek(tTempFile,0,SEEK_SET); tTempCmdFlag=1; if( NULL!=(pTempBuffer=(u8 *)malloc(tTempFileLen)) ) { if( tTempFileLen==read(tTempFile,pTempBuffer,tTempFileLen) ) { m=n=0; tTempFlag=0; while(n<tTempFileLen) { if( tTempFlag ) { if( pTempBuffer[n]<0x20) { if( tTempFlag ) { if( n>m ) { memcpy(pTempString,pTempBuffer+m,n-m); pTempString[n-m]=0; printf("String1 %s \n",pTempString); } tTempFlag=0; } } }else if( pTempBuffer[n]>=0x20 ) { m=n; tTempFlag=1; } n++; } if( (n>m)&&(tTempFlag) ) { memcpy(pTempString,pTempBuffer+m,n-m); pTempString[n-m]=0; printf("String2 %s \n",pTempString); } tTempCmdFlag=0; } free(pTempBuffer); } close(tTempFile); return tTempCmdFlag; } } return 2; } void main(void) { char name[20]="tmp.txt"; get_file_line(name,0); }
有点长,但是也算一种办法啦。