Можно ли создать функцию, которая читает половину текстового файла в C? - PullRequest
0 голосов
/ 16 марта 2019

(я очень новичок в 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;
}

Я знаю, что это читает ипечатает весь файл, но есть ли способ получить только первую или вторую половину файла для чтения?

Ответы [ 3 ]

0 голосов
/ 16 марта 2019

Если вы действительно не хотите читать вторую половину файла, вы не сможете это сделать, если не знаете размер файла. Другие ответы предполагают, что вы получите размер, прочитав весь файл и посчитав количество строк, что хорошо, если вы можете сделать это, как это происходит с небольшим файлом.

Если у вас есть файл с миллиардами строк, вы не хотите этого делать. В этом случае единственный вариант - использовать некоторую функцию операционной системы, чтобы получить размер файла. Но обычно это дает только размер файла, а не количество строк, поэтому вы не знаете, где остановиться / начать.

0 голосов
/ 16 марта 2019

Можно ли создать функцию, которая читает половину текстового файла ...?

Чтобы прочитать половину файла, прочитайте байт - пропустите байт.

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

... есть ли способ получить только первую или вторую половину файла для чтения?

Аууу, это не очень весело - добавить это условие в конец сообщения.

Первая длина файла поиска:

Как узнать размер файла
Как вы определяете размер файла
В Linux я бы использовал stat64();

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

Читать первую половину:

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

Читать 2-ую половину:

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);
0 голосов
/ 16 марта 2019

Сначала вы должны знать размер общей строки в файле.Вы можете сделать это, добавив и count , а затем увеличивая его после каждой строки.После этого настройте условие цикла на для (int i = 0; i .Для этого условия цикла вы можете прочитать и напечатать всю строку, но если вы установите для этого условия значение для (int i = 0; i , то будет напечатана первая половина и для (int i = count / 2; i это напечатает 2-ую половину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...