Pergunta

Eu preciso de uma maneira rápida fácil de obter uma seqüência de caracteres de um arquivo em C ++ padrão. Eu posso escrever meu próprio, mas só quero saber se já existe uma forma padrão, em C ++.

Equivalente de isso se você souber Cacau:

NSString *string = [NSString stringWithContentsOfFile:file];
Foi útil?

Solução

Podemos fazê-lo, mas é uma longa linha:

#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;
}

Editado: use "istreambuf_iterator" em vez de "istream_iterator"

Outras dicas

É quase possível com uma istream_iterator (3 linhas!)

#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));
}

Editado -. Se livrou de fluxo seqüência intermediária, agora cópias direto para a cadeia, e agora usando istreambuf_iterator, que ignora espaços em branco (graças Martin Iorque pelo seu comentário)

A biblioteca padrão C ++ não fornece uma função para fazer isso.

Melhor que posso fazer é 5 linhas:

#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());

Como sobre: ??

#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;
}

Se você fizer isso como o seguinte (mas devidamente embrulhado bem ao contrário abaixo), você pode ler o arquivo sem se preocupar com um byte 0x1A no arquivo (por exemplo) o corte da leitura do curto arquivo. Os métodos anteriormente sugeridas vai engasgar com um 0x1A (por exemplo) em um arquivo.


#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);
}

Mas, yeh, não é um já implementado 1-liner embora.

Edit: 0x1A não era um bom exemplo como ios_base :: binário vai cobrir isso. No entanto, mesmo assim, C ++ córregos, muitas vezes me dar problemas ao ler em arquivos PNG de uma vez com .read (). Usando o caminho C funciona melhor. Só não consigo lembrar um bom exemplo para mostrar o porquê. Foi provavelmente com .read () ing um arquivo binário em blocos em um loop vez que pode haver um problema com fluxos C ++. Assim, ignorar esta mensagem.

std::string temp, file; std::ifstream if(filename); while(getline(if, temp)) file += temp;

Não é uma curta ou single-declaração linha, mas é uma linha e não é realmente tão ruim assim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top