Вопрос по c++, file, digit – (C ++) Чтение цифр из текстового файла

1

У меня есть текстовый файл, который выглядит так:

73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511

и т. д. Всего 20 строк. Что я хочу сделать, это прочитать каждую цифру из текстового файла и поместить их в массив целых чисел (один элемент = одна цифра). Как я могу прочитать только одну цифру из этого текстового файла, а не всю строку?

используйте fgetc () для чтения символа и преобразования в целое число ... Kasma

Ваш Ответ

2   ответа
4
char digit;
std::ifstream file("digits.txt");
std::vector<int> digits;
// if you want the ASCII value of the digit.
1- while(file >> digit) digits.push_back(digit);
// if you want the numeric value of the digit.
2- while(file >> digit) digits.push_back(digit - '0'); 
9

There are several ways to accomplish what you are looking for, in this post I'll describe three different methods. All three of them assume that you open your file using an std::ifstream ifs ("filename.txt") and that your "array" is actually a vector declared as std::vector<int> v.

At the end of this post there is also a little advice on how to speed up insertion into your vector.


I'd like to keep it simple..

Самый простой подход - прочитать одинchar за один раз, используяoperator>> а затем вычесть'0' из возвращенного значения.

Стандартная гарантия того, что'0' через'9' последовательны, и так какchar это не что иное, как числовое значение, напечатанное в другом материале, к которому оно может быть неявно приведеноint.

char c;

while (ifs >> c)
  v.push_back (c - '0');

I love the STL, and hate writing loops..

Это будет восприниматься многими как & quot;c++ way to do it& quot ;, особенно, если вы говорите с фанатами STL, хотя для написания требуется гораздо больше кода ..

#include <algorithm>
#include <functional>
#include <iterator>

...

std::transform (
  std::istream_iterator<char> (ifs),
  std::istream_iterator<char> (), 
  std::back_inserter (v),
  std::bind2nd (std::minus<int> (), '0')
);

I don't want to write loops, but why not use a lambda?

#include <algorithm>
#include <functional>
#include <iterator>

...

std::transform (
  std::istream_iterator<char> (iss),
  std::istream_iterator<char> (),
  std::back_inserter (v),
  [](char c){return c - '0';}
);

Will my std::vector reallocate storage upon each insertion?

Да, возможно. Чтобы ускорить процесс, вы можете зарезервировать память в вашем векторе, прежде чем начинать делать какие-либо вставки, как показано ниже.

ifs.seekg (0, std::ios::end); // seek to the end of your file
v.reserve (ifs.tellg ()    ); // ifs.tellg () -> number of bytes in it
ifs.seekg (0, std::ios::beg); // seek back to the beginning

Похожие вопросы