如何使用c中的read()向后读取文件?

时间:2013-10-11 19:35:36

标签: c file-io

我应该创建一个程序,它接受一个给定的文件并创建一个带有反向txt的文件。我想知道有没有办法可以从文件末尾开始read()并将其复制到创建文件的第一个字节,如果我不知道文件的确切大小? 此外,我已经搜索了这个,并遇到了fread,fopen等许多例子。但是我不能使用这个项目,我只能使用read,open,lseek,write和close。  这是我的代码到目前为止它并不多,但仅供参考:

#include<stdio.h>
#include<unistd.h>

int main (int argc, char *argv[])
{
    if(argc != 2)/*argc should be 2 for correct execution*/
    {
        printf("usage: %s filename",argv[0[]);}
    }
    else
    {
    int file1 = open(argv[1], O_RDWR);
    if(file1 == -1){
    printf("\nfailed to open file.");
        return 1;
    } 
    int reversefile = open(argv[2], O_RDWR | O_CREAT);

    int size = lseek(argv[1],    0, SEEK_END);
    char *file2[size+1];
    int count=size;
    int i = 0

    while(read(file1, file2[count], 0) != 0)
    {
      file2[i]=*read(file1, file2[count], 0);
      write(reversefile, file2[i], size+1);
      count--;
      i++;
      lseek(argv[2], i, SEEK_SET);
   }

3 个答案:

答案 0 :(得分:1)

我怀疑大多数文件系统都是为有效支持此操作而设计的。有可能,您必须阅读整个文件才能达到目的。出于同样的原因,大多数语言可能不包括向后读取文件的任何特殊功能。

想出点什么。尝试在内存中读取整个文件。如果它太大,则将开头,反转,转换为临时文件并继续阅读...最后将所有临时文件合并为一个。此外,您可以通过手动低级操作磁盘扇区,或者至少使用针对文件系统的低级编程来做一些聪明的事情。看起来这不是你想要的。

答案 1 :(得分:0)

为什么不尝试fseek在文件中导航?此功能包含在stdio.h中,就像fopenfclose一样。

另一个想法是实现一个简单的堆栈......

答案 2 :(得分:0)

这没有错误检查==非常糟糕

  1. 使用stat
  2. 获取文件大小
  3. 使用malloc
  4. 创建缓冲区
  5. 将文件放入缓冲区
  6. 设置指向文件末尾的指针
  7. 打印每个字符向后通过缓冲区。
  8. 如果您通过Google获得创意,则可以获得以下几个示例。 IMO到目前为止你得到的帮助实际上并不是很好的提示。 这似乎是功课,所以要小心复制。做一些关于这里使用的调用的阅读。 stat(fstat)fread(read)

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/stat.h>
    
    int main(int argc, char **argv)
    {
       struct stat st;
       char *buf;
       char *p;
       FILE *in=fopen(argv[1],"r");   
       fstat(fileno(in), &st);         // get file size in bytes
       buf=malloc(st.st_size +2);      // buffer for file
       memset(buf, 0x0, st.st_size +2 );
       fread(buf, st.st_size, 1, in);  // fill the buffer
       p=buf;
       for(p+=st.st_size;p>=buf; p--)  // print traversing backwards
          printf("%c", *p);
       fclose(in);   
       return 0;
    }