Я читаю файл, используя функции fstream
и getline
. Я хочу указать начальную позицию, например. в моем файле 13 строк, я хочу начать читать его, например, с 7-й строки. Вот мой код:
#include<iostream>
#include <stdlib.h>
#include <string>
#include <vector>
#include<iterator> // for iterators
#include<map>
using namespace std;
int main()
{
string line;
int start= 7;
unsigned long int index;
For( int z=1; z<=13; z++){
if (f_node.is_open())
{
getline(f_node, line);
if ((line.find("$EndNodes") != string::npos))
{
cout << "$EndNodes found file closed .... " << endl;
f_node.close();
return false;
}
// Point index.
int i = 0;
int j = line.find_first_of(" ", i);
index = strtoul((line.substr(i, j)).c_str(), NULL, 0);//
}
} Я читаю только индексы и хочу начать с 7-го индекса. Как это сделать?
@Shawn, этого нельзя сделать таким образом. Допускается любое другое решение.
«например, в моем файле 13 строк, я хочу начать читать его с 7-й строки» Ну, если каждая строка не имеет одинаковой длины, чтение и игнорирование предыдущих строк - единственный способ сделать это. См. Ответ в качестве примера кода.
Если я вас правильно понял, вы хотите начинать чтение не с 7-й строки, а со строки с индексом 7. Итак, вам нужно прочитать строки, извлечь индекс из строки и сравнить с номером вашей начальной строки. Поскольку длина линий разная, другого выхода не вижу.
@Rene нет возможности указать коду начальную позицию, например seekg and tellg
? Я не знаю, как им пользоваться.
@RamiFar Конечно, вы можете установить указатель файла в нужное положение ... но ... всегда ли количество символов перед первой строкой с индексами, начинающимися с единицы, одинаково?
@Swordfish, поэтому я могу игнорировать только символы, а не всю строку. Моя 1 строка состоит из 4 целых чисел, первая - это индекс, за которым следует пробел, а затем 3 значения, разделенные пробелами. Все, что я могу сделать, как будто я читаю индекс, и о, это не та строка, которую я хочу прочитать, пропустить ее, перейти к следующей строке, прочитать индекс и снова пропустить ее. Что-то подобное
@RamiFar Вы можете установить указатель файла, используя seek()
, где хотите. Но если вы не знаете, в какую позицию (измеренную в char
с самого начала) вам нужно установить указатель файла, вам не повезло. Да, прочтите, проверьте, с чего вы хотите начать, если не игнорируйте остальную часть строки. повторить.
@Swordfish, не могли бы вы рассказать мне, как игнорировать остальную часть строки. мне нужно использовать ignore
?
@RamiFar, вы можете игнорировать остальную часть строки, используя f_node.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
, который будет игнорировать максимальное значение символов std::streamsize
, пока не встретит символ новой строки.
Чтобы отбросить некоторое количество строк, например:
#include <fstream>
#include <string>
int main() {
std::ifstream infile{"myfile.txt"};
std::string line;
int starting_line = 7;
// Read and discard beginning lines
for (int n = 1; n < starting_line; n += 1) {
if (!std::getline(infile, line)) {
// Error or premature end of file! Handle appropriately.
}
}
while (std::getline(infile, line)) {
// Do something with the lines you care about.
}
return 0;
}
За исключением фактической проверки и обработки ошибок и т. д.
Как while loop
начать читать с 7 строчки? Я не понимаю
@RamiFar Цикл for
читает и отбрасывает 6 строк. Итак, первая строка, прочитанная в цикле while
, является седьмой.
не могли бы вы помочь мне с этим, у меня 4 потока, я хочу прочитать один и тот же файл в системе циклического распространения. Подобно 1 потоку необходимо прочитать строку 1, а затем прочитать строку 4, пропуская следующие 3 строки снова и снова.
"нет способа указать коду начальную позицию, например, seekg и tellg?" Нет. NL, как и любой другой символ, не обрабатывается.
Вы просто должны сканировать поток, считая символ новой строки:
std::istream& seek_line(std::istream& is, const int n, std::ios_base::seekdir way = std::ios_base::beg)
{
is.seekg(0, way);
int i = 0;
char c;
while (is.get(c) && i < n)
if (c == '\n')
++i;
is.putback(c);
return is;
}
И это как вы используете вышеупомянутой функции:
int main()
{
using namespace std;
ifstream is{ "c:\\temp\\test.txt" };
if (!is)
return -1;
if (!seek_line(is, 3))
return -2;
string s;
getline(is, s);
cout << s << endl;
return 0;
}
Если вы хотите начать что-то с 7-й строкой, прочтите и проигнорируйте первые 6 строк в цикле for или что-то еще?