簡體   English   中英

是否可以創建一個函數來讀取C中的一半文本文件?

[英]Would it be possible to create a function that reads half a text file in C?

(我是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;
}

我知道這會讀取並打印整個文件,但是有一種方法可以讓我只讀取要讀取的文件的第一部分或后半部分嗎?

首先,您必須知道文件中總行的大小。 您可以通過添加和計數然后在每行之后遞增它來完成此操作。 在此之后,將循環條件調整為for(int i = 0; i <count; i ++) 對於此循環條件,您可以讀取並打印所有行,但如果您將此條件調整為for(int i = 0; i <count / 2; i ++),則將打印前半部分和(int i = count / 2; i < count; i ++)這將打印下半場。

如果您真的不想閱讀文件的另一半,除非您知道文件的大小,否則無法做到這一點。 其他答案建議您通過讀取所有文件並計算行數來獲得大小,如果可以這樣做就可以了,就像使用小文件一樣。

如果你有一個數十億行的文件,你不想這樣做。 在這種情況下,唯一的選擇是使用一些操作系統函數來獲取文件的大小。 但這通常只會給你文件的大小,而不是行數,所以你真的不知道在哪里停止/開始。

是否可以創建一個讀取半個文本文件的函數......?

要讀取文件的一半,讀取一個字節 - 跳過一個字節。

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,在帖子結尾添加條件看起來並不是很有趣。

首次查找文件長度:

如何獲取文件的大小
如何確定文件的大小
在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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM