2015-05-27 1 views
-1

Я новичок в C, поэтому немного запутался. Вот мой код:Почему я не могу прочитать данные из файла, где я написал текст. C

#include <stdio.h> 
#include <string.h> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <stdlib.h> 
#define FILENAME "/var/note" 

int main(int argc, char *argv[]) 
{ 
    int userid = getuid(); 
    int fd = open(FILENAME, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR); 
    write(fd, &userid, 4); 
} 

В основном я пишу UID в текстовом файле. Но когда я пытаюсь открыть файл примечаний (с рукой), он дает мне ошибку, которая говорит:

Файл, который вы открыли, имеет некоторые недопустимые символы. Если вы продолжите редактирование этого файла, вы можете повредить этот документ. Вы также можете выбрать другую кодировку символов и повторите попытку.

Я не могу понять, почему он дает мне эту ошибку (когда я на самом деле написал текст в этом файле) и как ее решить. На мой взгляд, проблема заключается в кодировке символов, но я не знаю, какой из них использовать. Извините, если вопрос звучит глупо. Спасибо.

+2

Вы пишете двоичное представление 'int', которое не является текстом. –

+0

Не очень уверен, но, может быть, проблема с кодировкой? Вы пытались использовать 'fopen()'/'fprintf()'/'flose()' trio? –

+0

ohh ... Теперь я получаю благодарность. Таким образом, файл будет содержать 4 байта в двоичном порядке? – Ojs

ответ

1

write(fd, &userid, 4);

Вы пишете 4 байта данных из памяти, начиная с начала вашей userid переменной, которая является int.

Предположим, что ваш идентификатор пользователя 42, ваш LSB находится справа (в порядке чтения человека), а ваша архитектура находится в Big endian. Ваша переменная содержит следующие 4 байта:

0000 0000 0000 0000 0000 0000 0010 1010 

Вы пишете эти 4 байта внутри файла, в результате чего эти символы:

NUL NUL NUL * 

Ваш блокнот предупреждает вас, потому что наличие NUL в файле не normal (напоминание: это то, что написано для guid 42, YMMV)

+0

Возможно ли мне написать номер сам вместо двоичного числа? – Ojs

+0

@ Ой, я упоминал о 'fprintf()'? –

+0

Если вы настаиваете на двоичном доступе, используйте 'sprintf' в буфер, а затем напишите буфер в файл. –

Смежные вопросы