0

これは、ドキュメントのデータを逆にして、同じドキュメント自体に保存するコードです。しかし、セグメンテーション違反が発生しています。助けてください。SegFault が発生する理由がわかりません。

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>


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

    int fd,n,i,j;

    char* buf;

    if(argc<2)
    printf("USAGE: %s file-to-reverse.\n",argv[0]);

    fd=open(argv[1], O_RDWR);
    if(fd==-1)
    printf("ERROR: Cannot reverse %s,file does not exist.\n",argv[1]);

    i = 0;
    j = n-1;

    while(i < j)
    {   
        read(fd,buf,n);

        char ib = buf[i];
        char jb = buf[j];

        jb = i++;
        ib = j--;

        write(fd,buf,n);
    }

    free(buf);
    close(fd);
}

EDIT1 追加してみました:

#include <sys/stat.h>
struct stat fs;


  fstat(fd, &fs);
  n= fs.st_size;
  buf = malloc(n * sizeof (char));

しかし今では、ドキュメント内の文字を反転するのではなく、何度も複製するだけです。

4

4 に答える 4

2

割り当ても初期化もしませんbuf

于 2010-09-05T19:42:45.487 に答える
2

初期化したことがないnので、負の値であってもかまいません。fstatまたはその他の方法を使用してファイルのサイズを決定し、それを に保存しますn

于 2010-09-05T19:42:55.467 に答える
2

バッファが割り当てられておらず、n = 0 であるため、0 文字を読み取ろうとします。これでコードが修復されます:

buf = malloc(10 * sizeof (char));
n = 10;

資力 :

于 2010-09-05T19:43:14.190 に答える
1

2 番目の EDIT について - ループが間違っています。

(1) 読み取りと書き込みをループから外します。これが、繰り返し書き込みを続ける理由です。

(2) ファイルの先頭にシークする必要があります。そうしないと、ファイルの末尾に新しいデータを追加することになります。

(3)実際には、バッファ内の文字を書き出す前に逆にする必要があります。

read(fd, buf, n);

while (i < j)
{

    char t = buf[i];

    buf[i] = buf[j];

    buf[j] = t;

    i++;
    j--;
}

lseek(fd, 0, SEEK_SET);

write(fd, buf, n);
于 2010-09-05T20:30:27.627 に答える