以下是example.txt
:
##TITLE
My program
# 1
# 2
##
到目前为止,我有一个函数可以读取整个文件并将其内容返回到char*
。
char *getTextBlock(const char *filename, char *textBlockLabel){
char *fileContents;
long fileSize;
FILE *fp= fopen(filename,"r");
fseek(fp, 0, SEEK_END);
fileSize= ftell(fp);
rewind(fp);
fileContents= malloc(fileSize * sizeof(char));
fread(fileContents, sizeof(char), fileSize, fp);
fclose(fp);
return fileContents;
}
当我运行此程序时,此函数将为getTextBlock("example.txt","##TITLE");
。
我想在##TITLE
中获取并返回##
和example.txt
之间的所有内容。
在这种情况下,这意味着:
My program
# 1
# 2
我该怎么做?
答案 0 :(得分:1)
事情是,一旦你用字符串获取文件内容就可以做到这一点
char *begin,*end;
begin= strstr( s, pattern) // ##TITLE
char *op = NULL;
if ( begin !=NULL )
{
begin += strlen( pattern);
end = strstr( begin, pattern1); // ##
if (end!=NULL )
{
op= malloc( end- begin+ 1 );
if(op == NULL)
{
printf("%s","ERROR in Allocation");
// if you use in function return or show message
}
else
{
memcpy( op, begin, end- begin);
op[end - begin] = '\0';
//print op or what you want
}
}
}
else
{
// first pattern not found. return empty string or show message
}
Vlad来自莫斯科的帮助最多。 这是他的answer。从几个月前我就用它了......并存放在我的机器上。现在我再次使用。
如果我们被要求执行任务
,这段代码就像我们要做的那样首先,我们正试图找出第一个" TITLE ##"来自包含文件所包含内容的字符串。
如果我们找不到它,那么程序将不会打印任何内容或可能返回一个空字符串。
如果第一个strstr
不返回NULL
,那么我们就找到了它。我们将再次开始搜索。但是我们从哪里开始呢?我们需要从第一个模式的结束开始,否则我们会从##
本身找到TITLE##
,这不是我们想要的。
所以我们正确设置指针,然后再次搜索第二个模式。
如果找到,那么我们将只分配一个大小为end-begin+1
的字符串,额外的空格1
用于保留\0
或字符串标记的结尾。
我们需要检查malloc
的返回值是否成功。
注意:最好使用NUL
对字符串进行术语处理,我的代码假设为。只需将\0
字符串末尾放在收集文件所有内容的位置即可。 子>
答案 1 :(得分:0)
我的解决方案:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* getTextBlock(const char *filename, char *textBlockLabel){
char *fileContents;
FILE * pFile;
long lSize;
char * buffer;
size_t result;
pFile = fopen (filename , "r" );
if (pFile==NULL) {
fputs ("File error",stderr);
return NULL;
}
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {
fputs ("Memory error",stderr);
return NULL;
}
// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);
if (result != (unsigned long)lSize) {
fputs ("Reading error",stderr);
return NULL;
}
fileContents = strstr(buffer, textBlockLabel);
if(fileContents!= NULL)
fileContents+= strlen(textBlockLabel);
fclose(pFile);
free (buffer);
return fileContents;
}
int main()
{
char * content = getTextBlock("example.txt","##TITLE");
if(content != NULL)
printf("%s", content);
return 0;
}
输出:
My program
# 1
# 2
##
有两种模式:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* getTextBlock(const char *filename, char *start, char *stop){
char *fileContents;
FILE * pFile;
long lSize;
char * buffer;
size_t result;
pFile = fopen (filename , "r" );
if (pFile==NULL) {
fputs ("File error",stderr);
return NULL;
}
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {
fputs ("Memory error",stderr);
return NULL;
}
// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);
if (result != (unsigned long)lSize) {
fputs ("Reading error",stderr);
return NULL;
}
fileContents = strstr(buffer, start);
if(fileContents!= NULL)
fileContents+= strlen(start);
char *end = strstr(fileContents, stop);
if(end == NULL)
return NULL;
end[0]= '\0';
fclose(pFile);
free (buffer);
return fileContents;
}
int main()
{
char * content = getTextBlock("example.txt","##TITLE", "##");
if(content != NULL)
printf("%s", content);
return 0;
}
输出:
My program
# 1
# 2