#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.