使用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);
}
答案 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()
。