1

これは非常に非効率的な方法かもしれませんが、その種の作業

このコードは、ファイル全体を読み取り、一度に 8 行のテキストをグローバル配列に格納し (可能であれば、これを行うためのより良いオプションが必要です)、さらに処理するためにディスパッチします。

ここにコードがあります

int count = 0;             //global
char *array_buffer[8];     //global

void line(char *line_char)
{

    int lent = strlen(line_char);
    array_buffer[count] = line_char;

    printf("%d\n",count);

    if (count == 8)
    {

        int row,col;
        for(row = 0; row<count; row++){
            printf("%d\n",row);
            for(col = 0; col<=lent; col++) {
                printf("%c", array_buffer[row][col]);
            }
        printf("\n");   
        }
    count = 0;
    }

    count++;
}



int main(int argc,char **argv)
{

    clock_t start = clock();

    FILE *fp = fopen(argv[1], "r");
    if(fp == NULL )
    {
        printf("Couldn't open file %s",argv[1]);
    }
    char buff[512];

    while (fgets(buff, 512, fp) != NULL )
    {
        line(buff);             /*sending out an array having one line*/
    }

    return 0;
}

問題は、array_buffer の内容を出力する際に​​、バッファーの最後の行を 8 回出力することです。(つまり、8行目は各サイクルでの読み取り値です)。それはかなり明白です

array_buff[0]
....
array_buff[7]

すべてが 8 行目のアドレスを指している

これを解決するのに何か助けはありますか? 何かをバッファリングする正しい方法ではないかもしれません。

4

3 に答える 3

2
void line(char *line_char){
    if (count == 8){
        int row,col;
        for(row = 0; row<count; row++){
            printf("%2d:",row);
            printf("%s", array_buffer[row]);
            free(array_buffer[row]);
        }
        count = 0;
    }
    int lent = strlen(line_char);
    array_buffer[count] = malloc((lent + 1)*sizeof(char));
    strcpy(array_buffer[count], line_char);
    //printf("%d\n", count);
    count++;
}
于 2013-07-05T15:39:47.737 に答える
2

表示される動作につながるアプローチの問題は、コードがバッファーからデータをコピーしないことです。この行

array_buffer[count] = line_char;

は、 8 つの場所すべてchar buff[512]から同じものへのポインターを置きます。main後続の呼び出しfgetsで以前の読み取りの内容をオーバーライドするため、最終的には最後の行の 8 つのコピーが作成されます。

この問題は、コピーを作成することで解決できます。たとえば、strdupメモリを割り当てmallocてコピーを作成するなどです。freeただし、割り当てるすべてのものを必要とします。

于 2013-07-05T14:59:21.330 に答える
1

古いポインターがあります。ここで説明します

while (fgets(buff, 512, fp) != NULL )
{
    //buff updated
    line(buff);
    //...
    //inside of the line function
        somepointertopointers[currIndex]=buff;

現在は buff の位置を見ているため、すべての要素が同じ位置を見ているため、文字をコピーするか、より長いバッファを作成して、ポインタが見ている位置を更新していることを確認する必要があります。同様に8つの個別のchar []ポインターを作成します

これにより、必要な結果が得られます

buff[512][8];
char** curr = buff;
while(fget(*curr,512,fp)!= NULL)
{
     line(*curr);
     curr++;
}

または、渡されたバッファを割り当てることもできます

#def BUFF_SIZE 512
#def BUFF_ARRAY_LEN 8


//put this somewhere before calling line 
//to initialize your array_buffer
for(i=0;i<BUFF_ARRAY_LEN;i++)
{
    array_buffer[i]=NULL;
}

...

//update in function line
//makes more sense to just use 
//the max len of a line
if(array_buffer[count] == NULL)
    array_buffer[count]=(char*)malloc(sizeof(char)*BUFF_SIZE);
strcpy(array_buffer[count],line_char);

...

//you will also need to
//clean up after you are 
//done with the memory
for(i=0;i<BUFF_ARRAY_LEN;i++)
{
    free(array_buffer[i]);
}
于 2013-07-05T15:01:27.673 に答える