这个代码可以反转文档的数据并将其保存在同一文档中。 但是我得到了一个Segmentation Fault.Please Help,我不知道为什么它会给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));
但现在它只是一次又一次地复制文档中的字符而不是 扭转它们。
答案 0 :(得分:2)
您不分配,也不初始化buf
。
答案 1 :(得分:2)
你从未初始化n
所以它可能是任何东西,甚至是负面的。使用fstat
或其他方法确定文件的大小并将其存储在n
中。
答案 2 :(得分:2)
您的缓冲区未分配且n = 0,因此您将尝试读取0个字符。 这应该修复你的代码:
buf = malloc(10 * sizeof (char));
n = 10;
资源:
答案 3 :(得分:1)
关于你的第二次编辑 - 你的循环是错误的。
(1)阅读&amp;写出循环 - 这就是为什么它再次写作&amp;试。
(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);