我正在尝试使用write()
函数(包含在内
)写入文件.程序很简单:在运行可执行文件时,我输入一条消息,然后将消息和我的用户ID(Linux UID)保存到文件中.
$ ./notetaker "Hello"
我原以为可以将以下值保存到文件中:
1000 Hello
有两个问题:
我的文件是用十六进制编写的(当我使用Sublime Text打开它时,我只能看到十六进制值)
插入的整数表示我的用户ID不正确
这是我在运行时得到的结果cat notes.txt
:
? Hello
当我用Sublime Text 打开notes.txt文件时,我可以读取以下数据:
e803 0000 0a48 656c 6c6f 0a
前4个字节不等于"1000".
为什么我的文件使用十六进制值保存?为什么数字不正确?
这是我的源代码:
#include#include #include #include #include #include void write_uid(const int); void write_note(const int, void *); int main(int argc, char *argv[]) { char *buffer = (char *) malloc(100); if(buffer == NULL) exit(0); strcpy(buffer, argv[1]); char *filename = (char *) malloc(50); if(filename == NULL) exit(0); strcpy(filename, "notes.txt"); int file_descriptor = open(filename, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR); if(file_descriptor == -1) exit(0); write_uid(file_descriptor); write_note(file_descriptor, buffer); if(close(file_descriptor) == -1) exit(0); printf("Your note has been saved successfully. \n"); free(buffer); free(filename); return 1; } void write_uid(const int file_descriptor) { int current_user_id = getuid(); int uid_write_result_code = write(file_descriptor, ¤t_user_id, sizeof(current_user_id)); int new_line_write_result_code = write(file_descriptor, "\n", 1); if(uid_write_result_code < 0 || new_line_write_result_code < 0) exit(0); } void write_note(const int file_descriptor, void *buffer) { int note_write_result_code = write(file_descriptor, buffer, strlen( (char *) buffer )); int new_line_write_result_code = write(file_descriptor, "\n", 1); if(note_write_result_code < 0 || new_line_write_result_code < 0) exit(0); }
我使用的是Ubuntu 14.04 Trusty Tahr(x64),我的GCC版本是4.8.4.此外,使用-Wall选项进行编译时,不会显示警告.
您的数值1000是前4个字节:e8 03 00 00
.
Intel CPU是little-endian,字节(不是nybbles)必须重新排序才能以正常的左右顺序读取它们,因此值变为00 00 03 e8
.删除前导零会使您3e8
保持十六进制,实际上是十进制的1000.
这里的问题是你current_user_id
在内存中按顺序将字节从32位整数写入文件.如果您希望它是人类可读的数字,则必须使用您选择的函数将其转换为字符串表示形式.阻力最小的路径可能是使用fprintf()
而不是write()
.