2012-03-11 6 views
1

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

код

#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 из целочисленного представления? Любая помощь будет очень оценена. Спасибо!

+1

Я не могу достаточно выяснить, что вы делаете с данными, так что вы, вероятно, должны уменьшить свой код к чему-то более простому, как «читать номер из «файл» и «записать номер в файл» - это намного проще экспериментировать. – che

+0

@che Я изменил код на что-то подобное, но очень простое, у меня все еще есть такая же проблема, хотя у вас есть предложение? – tpar44

+1

Вот ключ: 49 - это десятичное значение символа ASCII '1'. – blueshift

ответ

0

Основываясь на функции чтения, я считаю, что он читает первый байт в первом байте из 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 байтах.

+0

спасибо за помощь! к сожалению, это не сработало ... – tpar44

+1

'read (inF, & temp, 1);' или я что-то упускаю? –

+0

Вы правы. Я забыл указать, что функция хочет адрес temp. Изменен код, отражающий исправление. – Glenn

0

Система вызова функции чтения имеет декларацию, как:

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

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

bytes = read(num, &y, 1); 
0

Вы можете увидеть все детали файла ввода/вывода в C из этого link

1

Вы читаете первый байт 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-битными целыми числами, а также зависит от платформы byte order.

Что вы делаете:

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 
Смежные вопросы