C EOF后继续读取文件

时间:2016-12-19 07:24:05

标签: c

  1. 打开文件阅读
  2. 阅读所有行,直到EOF
  3. 5秒后,其他内容将附加到文件
  4. 是否可以再次阅读新写入的行直到EOF?

4 个答案:

答案 0 :(得分:1)

这应该有效:

#include <stdio.h>
#include <unistd.h>//To use the sleep function under UNIX

int main(void)
{
    FILE *f;
    int i;
    char line[1024];

    f = fopen("yourfile", "r");

    i = 0;
    while(fgets(line, 1024, f) != NULL)
    {
        //You can use your line here
        i++; //'i' is the number of line
    }

    fclose(f);
    sleep(5);//This line may change on windows

    f = fopen("yourfile", "r");//Reopen your file after modification

    while(i != 0)//We skip the line we already used
    {
        fgets(line, 1024, f);
        i--;
    }

    while(fgets(line, 1024, f) != NULL)//Here are the new line
    {
        //You can use your new line here
    }

    fclose(f);
    return 0;
}

答案 1 :(得分:0)

你可以计算你已经读过的行,5秒后你可以从下一行读取。

void GotoLine(std::fstream& file, unsigned int num){
    file.seekg(std::ios::beg);
    for(int i=0; i < num - 1; ++i){
        file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    }
    string line;
   file>>line;
   cout<<line<<endl; //printing the new line data
}

答案 2 :(得分:0)

在积极写入文件时,有一些点可以帮助读取文件: -

  1. 您可以在阅读器和编写器中使用带有MAP_SHARED的mmap()。通过这种方式,读者可以立即看到作者所做的更改。
  2. Linux在打开文件时不会对文件中的数据进行任何快照,因此即使您只使用read()和lseek(),也应该看到文件中正在进行的更改。
  3. 为了确定Linux中是否修改/打开/访问/等文件,您可以使用inotify API。这允许您使您的进程等待您感兴趣的事件直到它发生(而不是定期轮询)。
  4. tail(),找到文件的尾部。
  5. 一个小小片段可以为你工作:在这个例子中,我们同时阅读和写作。

    read_pos = write_pos = 0;
    while ((val1 = fgetc(file_descriptor)) != EOF) {
        read_pos = ftell(file_descriptor);
        fseek(file_descriptor, write_pos, SEEK_SET);
        if (('a' <= val1) && (val1 <= 'z')) {
          fputc(val1 - 32, file_descriptor);
        } else {
          fputc(val1, file_descriptor);
        }
        write_pos = ftell(file_descriptor);
        fseek(file_descriptor, read_pos, SEEK_SET);
      }
      fclose(file_descriptor);
      return (0);
    }
    }  
    

答案 3 :(得分:0)

使用clearerr()fseek()阅读EOF后,您可以清除错误和EOF指示。然后你必须决定你将如何停止;也许是因为未处理的信号(中断等)。这会产生如下代码:

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

int main(int argc, char **argv)
{
    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s file\n", argv[0]);
        return 1;
    }
    FILE *fp = fopen(argv[1], "r");
    if (fp == 0)
    {
        fprintf(stderr, "%s: failed to open file '%s' for reading\n",
                argv[0], argv[1]);
        return 1;
    }
    while (1)
    {
        char buffer[4096];
        while (fgets(buffer, sizeof(buffer), fp) != 0)
            fputs(buffer, stdout);
        clearerr(fp);    // fseek(fp, 0L, SEEK_CUR);
        sleep(5);
    }
    /*NOTREACHED*/
    return 0;
}

请注意,我将其写为C代码。但是,它也可以用C ++编译器完全编译(即使设置为繁琐)。

$ g++ -O3 -g -std=c++11 -Wall -Wextra -Werror tf17.cpp -o tf17  
$ gcc -O3 -g -std=c11   -Wall -Wextra -Werror tf19.c   -o tf19 
$

使用名为dribbler的家庭酿造程序对其进行了测试,该程序将消息缓慢地写入文件。

请注意,如果使用fseek()清除EOF状态,最好从当前位置(SEEK_CUR)寻找零字节偏移量。如果您寻求结束,您可能会跳过自程序检测到EOF以来写入的数据。如果文件在您阅读时被截断,您仍可能遇到问题。当前位置可能超出截断文件的末尾。