Существует ли острота для чтения в файле в строку в C++?

8
задан robottobor 25 September 2008 в 22:52
поделиться

7 ответов

Мы можем сделать это, но это - длинная линия:

#include<fstream>
#include<iostream>
#include<iterator>
#include<string>

using namespace std;

int main()
{
    // The one-liner
    string fileContents(istreambuf_iterator<char>(ifstream("filename.txt")), istreambuf_iterator<char>());

    // Check result
    cout << fileContents;
}

Отредактированный: используйте "istreambuf_iterator" вместо "istream_iterator"

17
ответ дан 5 December 2019 в 05:09
поделиться

Его почти возможный с istream_iterator (3 строки!)

#include <iostream>
#include <fstream>
#include <iterator>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    ifstream file("filename.txt");
    string fileContents;

    copy(istreambuf_iterator<char>(file),
              istreambuf_iterator<char>(),
              back_inserter(fileContents));
}

Отредактированный - избавился от промежуточного строкового потока, теперь копии прямо в строку, и теперь использующий istreambuf_iterator, который игнорирует пробел (благодарит Martin York за Ваш комментарий).

10
ответ дан 5 December 2019 в 05:09
поделиться

Стандартная библиотека C++ не обеспечивает функцию, чтобы сделать это.

3
ответ дан 5 December 2019 в 05:09
поделиться

Лучше всего я могу сделать, 5 строк:

#include <fstream>
#include <vector>
using namespace std;

ifstream f("filename.txt");
f.seekg(0, ios::end);
vector<char> buffer(f.tellg());
f.seekg(0, ios::beg);
f.read(&buffer[0], buffer.size());
2
ответ дан 5 December 2019 в 05:09
поделиться

Если Вы делаете это как следующее (но правильно обернутый приятно, в отличие от этого, ниже), можно читать в файле, не волнуясь о 0x1A байте в файле (например), прерывающем чтение файла. Ранее предложенные методы будут дросселировать на 0x1A (например), в файле.


#include <iostream>
#include <cstdio>
#include <vector>
#include <cstdlib>
using namespace std;

int main() {
    FILE* in = fopen("filename.txt", "rb");
    if (in == NULL) {
        return EXIT_FAILURE;
    }
    if (fseek(in, 0, SEEK_END) != 0) {
        fclose(in);
        return EXIT_FAILURE;
    }
    const long filesize = ftell(in);
    if (filesize == -1) {
        fclose(in);
        return EXIT_FAILURE;
    }
    vector<unsigned char> buffer(filesize);
    if (fseek(in, 0, SEEK_SET) != 0 || fread(&buffer[0], sizeof(buffer[0]), buffer.size(), in) != buffer.size() || ferror(in) != 0) {
        fclose(in);
        return EXIT_FAILURE;
    }
    fclose(in);
}

Но, yeh, это не уже реализованный 1 лайнер все же.

Править: 0x1A не был хорошим примером как ios_base:: двоичный файл покроет это. Однако даже затем потоки C++ часто дают мне проблему при чтении в png файлах внезапно с .read (). Используя путь C работает лучше. Просто не может помнить хороший пример для показа почему. Это был, вероятно, с .read () луг двоичный файл в блоках в цикле вместо этого, который может быть проблемой с потоками C++. Так, игнорируйте это сообщение.

0
ответ дан 5 December 2019 в 05:09
поделиться

Как насчет:

#include <fstream>
#include <sstream>
#include <iostream>

using namespace std;

int main( void )
{
  stringstream os(stringstream::out);
  os << ifstream("filename.txt").rdbuf();
  string s(os.str());
  cout << s << endl;
}
2
ответ дан 5 December 2019 в 05:09
поделиться
std::string temp, file; std::ifstream if(filename); while(getline(if, temp)) file += temp;

Это не короткая строка или строка с одним оператором, а одна строка, и она не так уж и плоха.

0
ответ дан 5 December 2019 в 05:09
поделиться
Другие вопросы по тегам:

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