2

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

  1. 使用 fp 获取文件并在该文件中搜索用双引号写入的字符串
  2. 将剩余文件写入另一个名为“NewData.txt”的文件中
  3. 重复步骤 1 和 2,直到搜索到所有用双引号写入的字符串并将其放入缓冲区数组中。

但我收到此错误,

 ./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

4 回答 4

2

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

于 2013-06-13T18:02:48.860 回答
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;
}
于 2013-06-13T22:08:09.340 回答
0

除非我遗漏了什么,否则以下代码不正确。

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

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

首先你循环直到文件结束或''。一旦你退出这个循环,你再次使用 fgetc 从同一个指针中读取

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

于 2013-06-13T18:19:19.907 回答
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;
}
于 2013-06-13T17:55:53.307 回答