使用mmap第一个字符是错误的
Using Mmap first character is wrong
我想使用 Mmap 更改 Hello,world! 文件的内容!世界果冻!
输入文件是 Hello.txt,即 1 行 Hello,world!
输出通常是`你好,世界!
输出应该是 Jello,world!
到 运行 程序 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);
}
这一行
*(the_file) = "Jello,world!";
将 "Jello,world!"
地址的截断值分配给文件中的第一个字符。
要将单个字符 'J'
分配给该地址,可以这样做:
*(the_file) = 'J';
此外,这一行:
printf("The file orginally contains:\n %s \n", the_file);
是一个等待发生的 SEGV。无法保证您的文件包含以 NUL 结尾的字符串。
不能通过直接赋值来复制数组。
使用memcpy()
如果源和目标都是 nil 终止字符数组(在这种情况下不是真的),您可以使用 strcpy(), strncpy()
或(仅限 bsd)strlcpy()
.
我想使用 Mmap 更改 Hello,world! 文件的内容!世界果冻!
输入文件是 Hello.txt,即 1 行 Hello,world! 输出通常是`你好,世界! 输出应该是 Jello,world! 到 运行 程序 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);
}
这一行
*(the_file) = "Jello,world!";
将 "Jello,world!"
地址的截断值分配给文件中的第一个字符。
要将单个字符 'J'
分配给该地址,可以这样做:
*(the_file) = 'J';
此外,这一行:
printf("The file orginally contains:\n %s \n", the_file);
是一个等待发生的 SEGV。无法保证您的文件包含以 NUL 结尾的字符串。
不能通过直接赋值来复制数组。
使用memcpy()
如果源和目标都是 nil 终止字符数组(在这种情况下不是真的),您可以使用 strcpy(), strncpy()
或(仅限 bsd)strlcpy()
.