使用Mmap第一个字符是错误的

时间:2015-04-17 01:19:37

标签: c mmap

使用Mmap我想从Hello,world改变文件的内容! Jello,世界!

输入文件是Hello.txt,这是1行Hello,world! 输出通常是'ello,world! 输出应该是Jello,世界! 运行程序pgm.exe hello.txt 1

关键的代码行是在程序结束时(也许某些东西是关键的,我只是不知道它)

谢谢你的帮助

#include <stdio.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>

void main(int argc, char *argv[]) {
int     fd, changes, i  ;
struct stat buf;
char        *the_file,
    *starting_string = "Jello,world!";

if (argc != 3) {
    printf("Usage: %s file_name #_of_changes\n", *argv);
    exit(1);
}

if ((changes = atoi(argv[2])) < 1) {
    printf("#_of_changes < 1\n");
    exit(1);
}

if ((fd = open(argv[1], O_CREAT | O_RDWR, 0666)) < 0) {
    printf("open error on file %s\n", argv[1]);
    exit(1);
}

//write(fd, starting_string, strlen(starting_string));

/* Obtain size of file to be mapped */
if (fstat(fd, &buf) < 0) {
    printf("fstat error on file %s\n", argv[1]);
    exit(1);
}

/* Establish the mapping */
if ((the_file = mmap(0, (size_t)buf.st_size, PROT_READ | PROT_WRITE,
    MAP_SHARED, fd, 0)) == (caddr_t)-1){
    printf("mmap failure\n");
    exit(1);
}

printf("The file orginally contains:\n %s \n", the_file);

*(the_file) = "Jello,world!"; 

printf("The file now contains:\n %s \n", the_file);

exit(0);


}

2 个答案:

答案 0 :(得分:0)

这一行

*(the_file) = "Jello,world!"; 

"Jello,world!"地址的截断值指定给文件中的第一个字符。

要将单个字符'J'分配给该地址,可以使用:

*(the_file) = 'J';

此外,这一行:

printf("The file orginally contains:\n %s \n", the_file);

是一个等待发生的SEGV。我们无法保证您的文件包含以NUL结尾的字符串。

答案 1 :(得分:0)

您无法通过直接分配复制数组。

使用memcpy()

如果source和target都是nil终止的字符数组(在这种情况下不是真的),则可以使用strcpy(), strncpy()或(仅限bsd)strlcpy()