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

何かが欠けていない限り、次のコードは正しくありません。

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 ループを完全に削除する必要があると思います。そこから抜け出すのに役立つものは何もありません。

于 2013-06-13T18:19:19.907 に答える
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

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 に答える