Чтение из текстового файла на C - PullRequest
1 голос
/ 12 марта 2012

У меня проблемы с чтением определенного целого числа из файла, и я не уверен, почему.Сначала я читаю весь файл, чтобы узнать, насколько он велик, а затем сбрасываю указатель на начало.Затем я прочитал 3 16-байтовых блока данных.Затем 1 20-байтовый блок, а затем я хотел бы прочитать 1 байт в конце как целое число.Тем не менее, я должен был написать в файл как символ, но я не думаю, что это должно быть проблемой.Моя проблема заключается в том, что когда я читаю его из файла, а не целочисленное значение 15, это 49. Я проверил в таблице ACII, и это не шестнадцатеричное или восьмеричное значение 1 или 5. Я полностью запутался, потому что мойчитать заявление read(inF, pad, 1), что я считаю правильным.Я знаю, что целочисленная переменная составляет 4 байта, однако в файле остался только один байт данных, поэтому я читаю только последний байт.
Мой код воспроизводит функцию (кажется, что много, но это нене думаю, что это так)

код:

#include<math.h>
#include<stdio.h>
#include<string.h>
#include <fcntl.h>


int main(int argc, char** argv)
{
char x;
int y;
int bytes = 0;
int num = 0;
int count = 0;



num = open ("a_file", O_RDONLY);

bytes = read(num, y, 1);

printf("y %d\n", y);

return 0;
}

Подводя итог моему вопросу, как получается, когда я читаю байт, в котором хранится 15 из текстового файла, я не могу просмотретьэто как 15 из целочисленного представления?Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 4 ]

1 голос
/ 12 марта 2012

Вы читаете первый байт типа int (4 байта), а затем выводите его целиком. Если вы хотите прочитать один байт, вам также нужно использовать его как один байт, например:

char temp; // one-byte signed integer
read(fd, &temp, 1); // read the integer from file
printf("%hhd\n", temp); // print one-byte signed integer

Или вы можете использовать обычный int:

int temp; // four byte signed integer
read(fd, &temp, 4); // read it from file
printf("%d\n", temp); // print four-byte signed integer

Обратите внимание, что это будет работать только на платформах с 32-разрядными целыми числами, а также зависит от порядка байтов платформы .

То, что вы делаете:

int temp; // four byte signed integer
read(fd, &temp, 1); // read one byte from file into the integer
   // now first byte of four is from the file,
   // and the other three contain undefined garbage
printf("%d\n", temp); // print contents of mostly uninitialized memory
0 голосов
/ 12 марта 2012

Системный вызов функции чтения имеет объявление вроде:

 ssize_t read(int fd, void* buf, size_t count);

Итак, вы должны передать адрес переменной int, в которой вы хотите прочитать материал. то есть используем

 bytes = read(num, &y, 1);
0 голосов
/ 12 марта 2012

С этой ссылкой

вы можете увидеть все детали файлового ввода / вывода в C
0 голосов
/ 12 марта 2012

Основываясь на функции чтения, я полагаю, что она считывает первый байт в первом байте из 4 байтов целого числа, и этот байт не помещается в младший байт. Это означает, что все, что находится в пэде для остальных 3-х байтов, все еще будет там, даже если вы инициализировали его нулем (тогда у него будут нули в других байтах). Я бы прочитал один байт и затем преобразовал его в целое число (если вам по какой-то причине нужно 4-байтовое целое число), как показано ниже:

/* declare at the top of the program */
char temp;

/* Note line to replace  read(inF,pad,1) */
read(inF,&temp,1);

/* Added to cast the value read in to an integer high order bit may be propagated to make a negative number */
pad = (int) temp;

/* Mask off the high order bits */
pad &= 0x000000FF;

В противном случае вы можете изменить объявление на неподписанный символ, который позаботится о других 3 байтах.

...