来自GNU C编程教程 : fgets (“file get string”)函数类似于gets函数。 这个函数已被弃用 – 这意味着它已经过时,强烈建议您不要使用它 – 因为它很危险。 这很危险,因为如果输入数据包含空字符,则无法分辨。 除非您知道数据不能包含null,否则不要使用fgets 。 不要使用它来读取用户编辑的文件,因为如果用户插入空字符,您应该正确处理它或打印清晰的错误消息。 如果可以,请始终使用getline或getdelim而不是fgets 。 我认为fgets函数遇到\0或\n时会停止; 当fgets应该正确处理输入时,为什么这个手册页建议空字节是“危险的”? 此外, getline和fgets之间的区别是什么,并且在C99或未来的C标准中真正被认为已弃用的fgets函数是什么?
今天的问题是我需要在起始位置的二进制文件中编写一个数字数组。 我有它应该开始的位置,我不想在此之后覆盖值,只是想将数组插入文件的起始位置。 例如: 12345 让我们在第2位推456: 12456345 我知道可能我必须自己实现它,但我想知道你对如何尽可能有效地实现它有什么看法。
显然POSIX说明了这一点 文件描述符或流在其引用的打开文件描述上称为“句柄”; 打开的文件描述可能有几个句柄。 […]应用程序影响第一个句柄上的文件偏移量的所有活动都应暂停,直到它再次成为活动文件句柄。 […]句柄不需要在同一过程中应用这些规则。 – POSIX.1-2008 和 如果两个线程分别调用[write()函数],则每个调用应该看到另一个调用的所有指定效果,或者没有一个。 – POSIX.1-2008 我对此的理解是,当第一个进程发出write(handle, data1, size1)而第二个进程发出write(handle, data2, size2) ,写入可以按任何顺序发生,但data1和data2 必须都是原始的和连续的。 但运行以下代码会给我带来意想不到的结果。 #include #include #include #include #include #include #include die(char *s) { perror(s); abort(); } main() { unsigned char buffer[3]; char *filename = “/tmp/atomic-write.log”; int fd, i, j; pid_t pid; unlink(filename); /* XXX Adding O_APPEND to the flags […]