Я пытаюсь работать с файловыми дескрипторами. Я преподавал, чтобы использовать filestreams (fopen, fread и т. Д.), Но теперь я хочу понять этот способ использования файлов.Файловые дескрипторы: проблемы с сохранением значения read int в переменной
Этот код, который я собираюсь опубликовать, выглядит тривиальным и глупым: он просто открывает файл под названием «файл», который имеет следующую структуру: 4 символа, целое число и значение «\ n» для каждой строки. Я не пытаюсь сделать что-нибудь полезное, я просто пытаюсь выполнить некоторые основные операции, которые я использовал с невероятной легкостью, используя потоки. В частности, мой файл имеет следующую информацию:
row 1
row 2
row 3
«строка» и пространство представляет собой 4-х символов, число представляет собой целое число. Я просто хотел бы распечатать содержимое файла, но я хочу запомнить значение int, с которым я сталкиваюсь (в противном случае печать каждого встреченного символа была бы достаточной) в переменной (поэтому я мог бы сделать некоторые разработки на основе этого значения, если захочу к). Это код, я использую:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
int main() {
int fd;
fd = open("file", O_RDONLY);
char *buffer;
buffer = (char*)malloc(20*sizeof(char));
unsigned char x;
int y = -1;
int number = 1;
int i=0, j;
while(read(fd, &x, 1*sizeof(char)) > 0) {
for(j=0; j<3; j++) {
buffer[i] = x;
i++;
read(fd, &x, sizeof(char)); // or 1 instead of sizeof(char)
}
buffer[i] = x;
buffer[i+1] = '\0';
printf("byte read: %d\n", read(fd, &y, sizeof(int))); // or 4 instead of sizeof(int): it's the same
printf("number read: %d\n", y); // crap value
printf("%s%d\n", buffer, y);
read(fd, &x, 1); // discard the new line
i=0;
}
close(fd);
}
Вот беда: когда я пытаюсь сохранить значение целого типа, так как SizeOf (INT) означает 4 байта, она просто читает 4-х символов. Таким образом, файловый дескриптор продвигается на 4 символа, и программа просто не делает того, что я хотел бы сделать (он «ест» следующие символы: «\ n», «r», «o»). Я не могу понять, как сказать, что следующий символ является целым числом и должен занимать 4 байта памяти. Поэтому, если вы пытаетесь записать 4-значные цифры в файле, отображение формата верное, но оно запоминает неправильное значение (поскольку оно видит 4 символа, а не число ...), которое не имеет ничего общего с целым числом в файле ,
Если я не могу этого сделать, я думал о запоминании номера в строке, а затем преобразовал строку в число. Но я видел несколько кодов, которые делались так же, как и в моем коде, поэтому Я очень смущен.
Что мне здесь не хватает?
Если это текстовый файл, почему вы ожидаете, что прочитаете 4 символьных байта в строке, чтобы равняться значению целочисленной переменной, в которую вы его храните. Если это текстовый файл, прочитайте текст в виде строки затем используйте функцию преобразования, чтобы преобразовать ее в целочисленное значение, представленное строкой – mathematician1975
На практике вам следует «читать» большой буфер (килобайты), и вы всегда должны хранить количество прочитанных байтов (т. е. счет, возвращаемый 'read ') –