我想从用户那里读取一些字符串输入并将其写入文件。现在我正在做
char name[25];
scanf("%s", name);
int handle = open("./visitors.txt", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if (handle < 0){
printf("File error.\n");
return;
}
lseek(handle, -sizeof(name), SEEK_END);
write(handle, name, sizeof(name));
这当然是不对的,因为大多数时候用户不写25个字符,只有更少,所以当用户输入5个字符时,另外20个将是空的,我最终有5个字符用户输入和输出文件中的20个字符乱码。如何确保只将用户输入写入文件?
答案 0 :(得分:1)
我不确定您要使用低级别系统调用open
,lseek
,write
的原因。通常,使用标准C fopen
,fscanf
,fprintf
函数来执行此类任务会更加方便。
在这种情况下,您可以尝试fgets
从stdin
获取字符串输入,然后使用fprintf
和%s
来写入文件。您仍然可以使用缓冲区name[25]
或name[100]
(设想来自stdin
的最大输入)。只需正确初始化它以确保它的NULL终止。然后使用fprintf
%s
将正确的字符串(即没有乱码结尾)写入文件。
答案 1 :(得分:1)
您正在使用原始系统调用来处理文件操作。除非您的目的是专门了解系统调用,否则您不应该这样做。 The write
call写入第三个参数指定的字节数。 sizeof(name)
在这种情况下是错误的。它将不返回字符串的长度,它将返回整个缓冲区的长度。
标准strlen
function为您提供字符串长度。因此,如果用户输入5个字符,则运行strlen(name)
将为您提供5个字符,与您使用的sizeof
不同。
除非您想要专门了解系统调用,否则您应该使用C标准库处理文件操作,使用fprintf
输出到文件,以及fopen
和{{1}等函数}。看看at the fprintf docs,它也链接到其他功能。