使用 lseek() 打印出重复的字符
Using lseek() prints out repeated characters
char x[3];
char buff, c;
x[0]='y';
int offset, i;
int fd;
fd = open("test1.txt", O_RDONLY);
if(fd==-1){ printf("Error on fopen."); exit(1); }
offset = lseek(fd, 1, SEEK_END);
printf("Size of file is: %d. \n", offset);
for(i=offset-1; i>=0; i--)
{
c = read(fd, &buff, 1);
printf("The character is: %c. \n", c);
}
close(fd);
运行 这给了我。
Size of file is: 6.
The character is: .
The character is: .
The character is: .
The character is: .
The character is: .
The character is: .
测试文件只包含单词"TEST"。我希望能够向后打印单词。
read
在当前位置读取,并将当前位置向前移动读取的量。
需要进一步寻找。另外 lseek( ..., 1, SEEK_END);
可能应该是 lseek(...,0, SEEK_END);
我会不愿意寻求超出文件的范围。
for( i = ... ) {
lseek(fd, size - i, SEEK_BEGIN );
read(...);
}
使用fstat()
获取文件大小,因为lseek()
到SEEK_END
不保证return一个文件的大小,您可以使用pread()
反向读取文件而无需进行任何搜索。这没有任何错误检查 - 应该将其添加到将要使用的任何代码中:
struct stat sb;
int fd = open("test1.txt", O_RDONLY);
fstat( fd, &sb );
while ( sb.st_size > 0 )
{
char buff;
sb.st_size--;
pread( fd, &buff, sizeof( buff ), sb.st_size );
printf( "Char read: %c\n", buff );
}
close( fd );
char x[3];
char buff, c;
x[0]='y';
int offset, i;
int fd;
fd = open("test1.txt", O_RDONLY);
if(fd==-1){ printf("Error on fopen."); exit(1); }
offset = lseek(fd, 1, SEEK_END);
printf("Size of file is: %d. \n", offset);
for(i=offset-1; i>=0; i--)
{
c = read(fd, &buff, 1);
printf("The character is: %c. \n", c);
}
close(fd);
运行 这给了我。
Size of file is: 6.
The character is: .
The character is: .
The character is: .
The character is: .
The character is: .
The character is: .
测试文件只包含单词"TEST"。我希望能够向后打印单词。
read
在当前位置读取,并将当前位置向前移动读取的量。
需要进一步寻找。另外 lseek( ..., 1, SEEK_END);
可能应该是 lseek(...,0, SEEK_END);
我会不愿意寻求超出文件的范围。
for( i = ... ) {
lseek(fd, size - i, SEEK_BEGIN );
read(...);
}
使用fstat()
获取文件大小,因为lseek()
到SEEK_END
不保证return一个文件的大小,您可以使用pread()
反向读取文件而无需进行任何搜索。这没有任何错误检查 - 应该将其添加到将要使用的任何代码中:
struct stat sb;
int fd = open("test1.txt", O_RDONLY);
fstat( fd, &sb );
while ( sb.st_size > 0 )
{
char buff;
sb.st_size--;
pread( fd, &buff, sizeof( buff ), sb.st_size );
printf( "Char read: %c\n", buff );
}
close( fd );