Чтение только ОПРЕДЕЛЕННОГО диапазона строк в текстовом файле C

#c

#c

Вопрос:

Привет, у меня есть текстовый файл, который содержит некоторые числовые данные. Из этого текстового файла ТОЛЬКО строки от 14 до 100 должны быть прочитаны в мою программу на C . Каждая из этих строк содержит три числа, соответствующие координатам x, y, z точки. Таким образом, координаты даны для 87 точек в целом.

Я хочу поместить эти числа в массивы xp[87] yp[87] and zp[87].

Как мне это выполнить?

До сих пор я привык к следующему

 ifstream readin(argv[1])//Name of the text file 

for (int i=0; i<=86;   i)
{
readin>>xp[i]>>yp[i]>>zp[i];
}
  

Но этот метод работает только для тех файлов, которые содержат 87 строк, а считываемые данные начинаются с самой первой строки.

В данном случае я хочу игнорировать ВСЕ строки до строки 14 и ВСЕ строки после строки 100

Ответ №1:

Чтение построчно, для большей гибкости вашего формата:

 #include <fstream>
#include <sstream>
#include <string>

std::ifstream infile("thefile.txt");
std::string line;

unsigned int count = 0;

while (std::getline(infile, line))
{
    count;
  if (count > 100) { break; }    // done
  if (count < 14)  { continue; } // too early

  std::istringstream iss(line);
  if (!(iss >> x[count - 14] >> y[count - 14] >> z[count - 14]))
  {
    // error
  }
}

// all done
  

Ответ №2:

В данном случае я хочу игнорировать ВСЕ строки до строки 14

Поскольку вам нужно фактически прочитать файл, чтобы узнать, где заканчивается строка и начинается новая, вам нужно будет прочитать 13 строк. Используйте getline() и фиктивную строку для хранения результатов из нее.

и ВСЕ строки после строки 100

Просто закройте поток и покончите с этим.

Ответ №3:

Через несколько лет Range-v3 позволяет написать это:

 #include <fstream>
#include <iostream>
#include <range/v3/view/drop.hpp>
#include <range/v3/view/getlines.hpp>
#include <range/v3/view/take.hpp>

using namespace ranges;
using namespace ranges::views;

int main() {

    std::ifstream ifs{"inputFile"};

    auto lines = getlines(ifs) | take(100) | drop(15/* which is 14 - 1 */);

    for (auto i : lines) {
        std::cout << i << std::endl;
    }
}
  

Требуется C 17.