从C中的文本文件中读取

时间:2012-03-11 23:42:58

标签: c file pointers byte ascii

我无法从文件中读取特定的整数,但我不确定原因。首先,我读完整个文件以找出它有多大,然后我将指针重置为开头。然后我读了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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

否则,您可以将声明更改为unsigned char,它将处理其他3个字节。

答案 2 :(得分:0)

读取函数系统调用具有如下声明:

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

因此,您应该传递要在其中读取内容的int变量的地址。 即使用

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

答案 3 :(得分:0)

您可以从link

中查看C中文件I / O的所有详细信息