现在有个TXT文件 有 A B C三段 如何读取B段 B段开头为B 结尾为END B
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);
大致过程就是这样,纯手打,没有调试过,可能有错追问
全部文件读出来可以 我现在要读取文件中指定的一段
只单纯读文件某一段,首先要知道这段内容开头的位置并定位文件指针,还要知道内容长度,这个除非你读取前就知道,否则不如直接读取全文或者一段一段读取,然后用遍历字符串判断的方法把你题目中说的B开头ENDB结尾的内容。
#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
//从文件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);
}