【问题标题】:Would it be possible to create a function that reads half a text file in C?是否可以创建一个读取半个 C 文本文件的函数?
【发布时间】:2019-03-16 08:00:20
【问题描述】:

(顺便说一句,我对 C 很陌生,但在来这里之前我已经看过了,我只看到过有关在文本文件中查找特定字符串的问题)

void *readFile() {
    FILE* myFile;
    myFile = fopen ("SampleFile.txt","r");
    char line[150];

    while(!feof(myFile)) {
      fgets(line, 150, myFile);
      puts(line);
    }
    fclose(myFile);

    return NULL;
}

我知道这会读取并打印整个文件,但有没有办法让我只读取文件的前半部分或后半部分?

【问题讨论】:

  • while(fgets(line, 150, myFile) != NULL) { puts(line); }。您可以读取文件,计算行数,然后倒回文件并重复一半的行数。或者,忽略这么多行。
  • fgets 不会删除换行符,但 puts 会添加换行符。这将使您的文件加倍空间(并打印最后一行两次)。

标签: c file io


【解决方案1】:

首先,您必须知道文件中总行的大小。您可以通过添加和 count 来做到这一点,然后在每一行之后递增它。之后,将循环条件调整为 for(int i=0; i 。对于此循环条件,您可以读取并打印所有行,但如果您将此条件调整为 for(int i=0; i 这将打印前半部分和 for (int i=count/2; i 这将打印第二半。

【讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读How to Answer 页面。您可以通过将代码块放在上下各空行的段落中并将其缩进四个空格来将代码呈现为代码(通常通过选择代码并使用编辑框上方的 {} 按钮) .
  • 您的描述有点混乱。如果要打印文件的前半部分(以字节、字符或行为单位),则需要以适当的单位知道文件的大小。可以使用系统调用找到字节;像 UTF-8 这样的多字节字符集中的字符和行必须通过读取整个文件并计算字符或行数来确定,然后倒带和反刍文件的适当段。请注意,管道和套接字等不能重绕;这也让生活变得复杂。
  • 感谢@JonathanLeffler。下次我会尝试以良好的理解和陈述来回答。
  • 感谢@JonathanLeffler。下次我会尝试以良好的理解和陈述来回答。
【解决方案2】:

是否可以创建一个读取半个文本文件的函数...?

要读取一半文件,读取一个字节 - 跳过一个字节。

int ch;
while((ch = fgetc(myFile)) != EOF) {
  putchar(ch);
  fseek(myFile, 1, SEEK_CUR);
}

要打印每隔一行,请使用fgets() 的返回值并切换标志print

bool print = true;
while(fgets(line, sizeof line, myFile)) {
  if (print) {
    fputs(line, stdout);
  }
  print = !print; 
}

...有没有办法让我只读取文件的前半部分或后半部分?

哎呀,在帖子的结尾添加这个条件看起来不是很有趣。

先查找文件长度:

How can I get a file's size
How do you determine the size of a file
在 Linux 上,我会使用 stat64();

long size = foo(); // from one of above 3 ideas

阅读前半部分:

rewind(myFile);
int ch;
while(size-- > 0 && (ch = fgetc(myFile)) != EOF) {
  putchar(ch);
}

阅读下半场:

fseek(myFile, size/2, SEEK_SET);
int ch;
while((ch = fgetc(myFile)) != EOF) {
  putchar(ch);
}

这是打印前半部分的一个有趣的想法,只需编写几个队列函数。

queue *q = q_init();
int ch;
// Read 2 bytes, save, write earliest byte
while((ch = fgetc(myFile)) != EOF) {
  q_append(q, ch);
  ch = fgetc(myFile);
  if (ch != EOF) q_append(q, ch);
  ch = q_get(q);
  putchar(ch);
}
q = q_uninit(q);

【讨论】:

    【解决方案3】:

    如果您真的不想读取文件的另一半,除非您知道文件的大小,否则没有办法这样做。其他答案建议您通过读取所有文件并计算行数来获得大小,如果您可以这样做,这很好,因为它是一个小文件。

    如果你有一个数十亿行的文件,你不想这样做。在这种情况下,唯一的选择是使用一些操作系统函数来获取文件的大小。但这通常只会给你文件的大小,而不是行数,所以你真的不知道在哪里停止/开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2018-06-19
      相关资源
      最近更新 更多