C语言如何读取文件中指定的某一段

现在有个TXT文件 有 A B C三段 如何读取B段 B段开头为B 结尾为END B

使用fread函数读取指定长度的字符串,即使包含\n也会被读取,可以首先使用fseek定位到文件结尾,然后ftell函数返回的值就是文件的大小,这样就可以用循环多次读取文件,直到读取所有内容

FILE *file = NULL;
char szFile[1025] = {0};
int nHadRead = 0;
file = fopen( "file.txt", "r+");
if ( file == NULL )
return;

fseek( file, 0, SEEK_END ); //定位到文件尾
int nLen = ftell( file ); //获取当前位置,即文件长度
fseek( file 0, SEEK_SET ); //重新定位到文件开头,准备开始读
while ( nHadRead < nLen )
{
int nRead = nLen - nHadRead >1024 ? 1024 : nLen - nHadRead; //如果剩余小于1024字节,则读剩余字节,否则每次读取1024字节。
int nTmp = fread( szFile, 1, nRead , file );
nHadRead += nTmp;

printf( "%s", szFile );

memset( szFile, 0x0, sizeof(szFile) );
}
fclose(file);

大致过程就是这样,纯手打,没有调试过,可能有错追问

全部文件读出来可以 我现在要读取文件中指定的一段

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-09-10

只单纯读文件某一段,首先要知道这段内容开头的位置并定位文件指针还要知道内容长度,这个除非你读取前就知道,否则不如直接读取全文或者一段一段读取,然后用遍历字符串判断的方法把你题目中说的B开头ENDB结尾的内容。

第2个回答  2019-09-10

#include<>

#include<>

#define TBEGIN "B"

#define TEND "END B"

void main() { FILE *fp; char buffer[256];

if ( fp=fopen("c:\\test.txt","r") ) {

while ( !feof(fp) ) { fgets(buffer,255,fp); if ( strcmp(buffer,TBEGIN)==0 ) break; }

while ( !feof(fp) ) { 

fgets(buffer,255,fp); if ( strcmp(buffer,TEND)==0 ) break; else printf("%s\n",buffer);

}

fclose(fp);

} else printf("无法打开文本文件.\n");

}

追问

while ( !feof(pFile) )
{
fgets(buffer,255,pFile);
if ( strcmp(buffer,TBEGIN)==0 )
break;
}
老哥 你的程序一直运行到这 没东西进tbegin啊

追答

你文本文档是否有大写字母B单独一行的内容作为目标内容开始? 程序一直在找这个开始标志行未得

追问

这是文件内容

追答

你的意思是单独的大写字母B作为起始标志,字符串END B作为结束标志,并且出现在一行中,仅显示其中的内容"bbbbbbb "这些内容.程序需要修改一下了: 两句while(!feof(fp))去掉换成
int i;
while(!feof(fp)) {
i=0; fgets(buffer,255,fp); if ( buffer[0]!='B' ) continue;
i=1;
while ( buffer[i] ) {
if ( strcmp(buffer+i,TEND)==0 ) break; else { printf("%c",buffer[i]); i++; }

}
if ( i ) printf("\n");
}

追问

已解决 感谢老哥在线解答

老哥 我换个文件读取 关键字段MACRO XOR3X4开头 WHILE里面的条件该怎么换呢

追答

#include<stdio.h>

#include<string.h>

#define TBEGIN "MACRO XOR3X4"

#define TEND "END B"

void main() { FILE *fp; char buffer[256],buf[256]; int i,n1,n2;

n1=strlen(TBEGIN); n2=strlen(TEND);

if ( fp=fopen("c:\\test.txt","r") ) {

while ( !feof(fp) ) {

fgets(buffer,255,fp); strcpy(buf,buffer); buf[n1]=0; if ( strcmp(buf,TBEGIN) ) continue;

i=n1;

while ( buffer[i] ) {

strcpy(buf,buffer+i); buf[n2]=0; if ( strcmp(buf,TEND)==0 ) break;

printf("%c",buffer[i]); i++;

}

if ( i>n1 ) printf("\n");

}

fclose(fp);

} else printf("无法打开文本文件.\n");

}

当c:\test.txt内容为以下时输出见图

abegin abcdefgh enda

bbegin abcdefgh endb

cbegin abcdefgh endc

dbegin abcdefgh endd

MACRO XOR3X4--ABCDEFGH -- END B

ebegin abcdefgh ende

MACRO XOR3X4--12345678...END B

fbegin abcdefgh endf

gbegin abcdefgh endg

hbegin abcdefgh endh

本回答被提问者和网友采纳
第3个回答  2019-09-10
#include<stdio.h>
//从文件p中接收第n行字串,保存在str中
//假设一行的文本内容不超过1000字符,如果估计超过,请自行修改函数中的1000
//如果打不开文件,返回NULL
//如果文件不足n行,返回NULL
//如果正获得正常数据,返回str的地址
char *getfileline(char *p,int n, char *str){
FILE *fp;
int i;
if ((fp=fopen(p,"r"))==NULL){
printf("打开文件错误\n");
return NULL;
}
for(i=1;i<n;i++)
if ((fgets(str,1000,fp))==NULL) {
fclose(fp);
return NULL;
}
fgets(str,1000,fp);
fclose(fp);
return str;

}

int main(){
char p[1000];
getfileline("d:\\temp.txt", 10, p);
puts(p);
}
第4个回答  2019-09-10
你可以使用条件调用指令,使用某个条件直接调用所需要的文件段就可以了

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网