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

时间:2019-03-16 08:00:20

标签: c file io

(我对C btw还是很陌生,但是在来到这里之前我已经看过了,而且我只看到了有关在文本文件中查找特定字符串的问题)

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;
}

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果您确实不想读取文件的另一半,则除非您知道文件的大小,否则无法这样做。其他答案建议您通过读取所有文件并计算行数来获取大小,如果可以的话,这很好,就像处理小文件一样。

如果您有数十亿行的文件,则不希望这样做。在这种情况下,唯一的选择是使用某些操作系统功能来获取文件的大小。但这通常只会给您文件的大小,而不是行数,因此您实际上并不知道在哪里停止/开始。

答案 2 :(得分:0)

  

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

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

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; 
}

  

...有什么方法可以让我读取文件的前半部分或后半部分?

Awww,在帖子的结尾中添加该条件看起来并不有趣。

首次查找文件长度:

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);