C:在文件中搜索内容

时间:2013-06-13 17:51:29

标签: c file-io

在下面的代码中,我正在做以下事情:

  1. 使用fp获取文件,并在该文件中搜索以双引号
  2. 编写的字符串
  3. 将剩余文件写入另一个名为“NewData.txt”
  4. 的文件中
  5. 重复步骤1和2,直到用双引号编写的所有字符串都被搜索并放入缓冲区数组中。
  6. 但是我收到了这个错误,

     ./my_script: line 9: 27310 Segmentation fault      ./a.out
    

    我没有得到它在代码中做错的地方....

    
       char *read_quoted_string(char outbuff[], FILE *fp){
        char *buffer[1000];
        int ch;
        int i;
        int counter=0;
        int increment=0;
    
            int prev=ftell(fp);
        fseek(fp, 0L, SEEK_END);
        int lengthOfFile=ftell(fp);
        fseek(fp,prev,SEEK_SET);
        fprintf(stdout,"%d",lengthOfFile);
        while(lengthOfFile>0){
    
           while(EOF!=(ch=fgetc(fp)))
               if(ch == '"') break;
    
        for(i=0;EOF!=(ch=fgetc(fp));++i)
        {
            if(ch == '"') break;
            outbuff[i] = ch;
            }
    
        outbuff[i]='\0';
    
    
        ///////////////////////////////////////
        char filename3[] = "NewData.txt";
    
        FILE *file3 = fopen ( filename3, "w" );
    
        if(file3!=NULL){
        while(EOF!=(ch=fgetc(fp)))  
        fputc(ch,file3);
    
        }
        fclose(file3);
    
    
    
    
        buffer[increment]=outbuff;
        increment=increment+1;
        fp=file3;
        prev=ftell(fp);
            fseek(fp, 0L, SEEK_END);
        lengthOfFile=ftell(fp);
            fseek(fp,prev,SEEK_SET);
    }
        return   buffer[increment];
    }
    

4 个答案:

答案 0 :(得分:2)

如何使用SEEK_END转到文件的末尾 然后使用循环从该位置读取。 首先需要将光标重新设置到起始位置,然后循环文件。

答案 1 :(得分:0)

你能使用C ++(特别是C ++ 11)吗?如果是,您应该使用std::regex_search而不是在C中重新实现某些内容。

std::string s ("blablabla \"bla bla\" bla \"bla \"");
std::smatch m;
std::regex e ("\"([^\"]*)");

while (std::regex_search (s,m,e)) {
 for (auto x:m) std::cout << x << " ";
 std::cout << std::endl;
}

答案 2 :(得分:0)

除非我遗漏了某些内容,否则以下代码不正确。

while(EOF!=(ch=fgetc(fp)))
    if(ch == '"') break;

for(i=0;EOF!=(ch=fgetc(fp));++i)
{
    if(ch == '"') break;
    outbuff[i] = ch;
}

首先循环直到文件结束OR''。一旦你离开了这个循环你再次使用fgetc从同一个指针读取

我相信您需要将指针重置为文件的开头,或者您可以完全删除while循环。我没有看到任何有用的东西。

答案 3 :(得分:0)

也许,像这样翻拍

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void){
    FILE *in, *out;
    char *buffer[1000];
    int increment = 0;

    if(NULL!=(in =fopen("data.txt", "r"))){
        if(NULL!=(out=fopen("NewData.txt", "w"))){
            char buff[1000];
            int i=0, ch, in_str = 0;
            while(EOF!=(ch=fgetc(in))){
                switch(ch){
                case '"':
                    if(in_str){
                        buff[i] = '\0';
                        buffer[increment++] = strdup(buff);
                        i=0;//reset
                        if(increment == 1000){
                            fprintf(stderr, "Size of the buffer is insufficient!");
                            fclose(in);fclose(out);
                            return -1;
                        }
                    }
                    in_str = !in_str;
                    break;
                default:
                    if(in_str){
                        buff[i++]=ch;
                    } else {
                        fputc(ch, out);
                    }
                }
            }
            fclose(out);
        }
        fclose(in);
    }
    {
        int i;
        for(i=0;i<increment;++i)
            printf("%s\n", buffer[i]);
        //dealloc
        for(i=0;i<increment;++i)
            free(buffer[i]);
    }
    return 0;
}