2015-02-27 4 views
0

Я пытаюсь работать с файловыми дескрипторами. Я преподавал, чтобы использовать 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 символа, а не число ...), которое не имеет ничего общего с целым числом в файле ,

Если я не могу этого сделать, я думал о запоминании номера в строке, а затем преобразовал строку в число. Но я видел несколько кодов, которые делались так же, как и в моем коде, поэтому Я очень смущен.

Что мне здесь не хватает?

+2

Если это текстовый файл, почему вы ожидаете, что прочитаете 4 символьных байта в строке, чтобы равняться значению целочисленной переменной, в которую вы его храните. Если это текстовый файл, прочитайте текст в виде строки затем используйте функцию преобразования, чтобы преобразовать ее в целочисленное значение, представленное строкой – mathematician1975

+1

На практике вам следует «читать» большой буфер (килобайты), и вы всегда должны хранить количество прочитанных байтов (т. е. счет, возвращаемый 'read ') –

ответ

5

Вы, кажется, путаете целые числа, напечатанные как символы/байты в файле, и int переменные (которые занимают 4 байта памяти, как вы говорите) внутри вашей программы.

Функция read() просто считывает байты (или char s) из вашего файла. Эта функция не имеет представления о том, что вы читаете.

Если вы хотите получить int, вам необходимо конвертировать байты, которые вы прочитали, в int. Посмотрите на sscanf(), strtol(), ...

BTW, int s действительно часто занимает 4 байта пространства, но это не всегда так; это зависит от платформы.

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

  • Нет связанных вопросов^_^