如何读取文本文件的内容并在我指定的两个字符串之间返回一个字符串?

时间:2017-01-01 06:54:03

标签: c

以下是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

我该怎么做?

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或字符串标记的结尾。

    < / LI>
  • 我们需要检查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