2009-05-08 5 views
0

Что минимальный код, необходимый для чтения файла и присвоить его содержимое в строку в C++? Я читал много учебников, которые работали, но все они были разные по пути, так что я пытаюсь понять, почему, так что если вы можете, пожалуйста, включают в себя некоторые пояснительные комментарии, которые были бы велики.C++ Чтение файлов


Связанный:What is the best way to read an entire file into a std::string in C++?

ответ

2
#include <fstream> 
#include <string> 

int main() 
{ 
    std::ifstream file("myfile.txt"); // open the file 
    std::string line, whole_file; 

    // Read one line at a time from 'file' and store the result 
    // in the string called 'line'. 
    while (std::getline(file, line)) 
    { 
     // Append each line together so the entire file will 
     // be in one string. 
     whole_file += line; 
     whole_file += '\n'; 
    } 

    return 0; 
    // 'file' is closed automatically when the object goes out of scope. 
} 

Несколько вещей, чтобы отметить здесь. getline() возвращает ссылку на объект потока, который не работает во время теста, если что-то происходит плохо или если вы достигнете конца файла. Кроме того, тянущаяся символ новой строки не включены в строку, так что вы должны добавить его вручную.

+0

Я думаю, что это дает неправильный ответ, если файл не оканчивается символом новой строки. –

+0

Добавление правильного if-теста в ловушку для такого условия остается в качестве упражнения для OP. ;-) –

+0

Только упоминание об этом, потому что вопрос задает минимальный код: стандарт C++ примет «return 0;»; если достигнут конец основной функции. Это особый случай для main() –

1

Я читаю слово из каждой строки.

#include<fstream> 
    #include<string> 
    using namespace std;  
    int main(int argc, char **argv) 
    { 
    fstream inFile; 
    string str; 
    while(!inFile.eof()) 
    { 
    inFile.open("file.txt"); 
    infile>>str; 
    } 
    inFile.close(); 
    return 0; 
    } 
+0

В C++, основной должен возвращать Int. Также, похоже, вы пропустили std :: namespace. – 2009-05-08 19:47:48

+0

И вы забыли # включить . – 2009-05-08 19:49:57

+0

Да, я забыл включить заголовок строки и стандартную библиотеку. Но я использовал основную функцию void, которая не возвращает никакого значения. Если вы используете int main, то для этого требуется возвращаемое значение. –

3

Похоже дубликата:

How do you get a file in C++?

Во всяком случае, хорошая ссылка: http://www.cplusplus.com/doc/tutorial/files/

+0

Ответ, который вы цитируете, заполнен плохим кодом. – 2009-05-08 20:08:24

+0

Ну, я не сказал, что на вопрос ответили хорошо :) и есть и другие подобные вопросы, которые я нашел. Второй ответ - это реальный ответ. –

2

Самый короткий код: (не эффективна)

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

int main() 
{ 
    std::ifstream f("plop"); 


    std::string buffer; 
    std::copy(std::istreambuf_iterator<char>(f), 
       std::istreambuf_iterator<char>(), 
       std::back_inserter(buffer)); 
} 

Как я, вероятно, сделать это:

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



int main() 
{ 
    // Find the size of the file 
    std::ifstream  file("Plop"); 
    file.seekg(0,std::ios_base::end); 

    std::streampos  size = file.tellg(); 

    // Read the file in one go. 
    file.seekg(0); 
    std::vector<char> buffer(size); // pre-szie the vector. 
    file.read(&buffer[0],size); 

    // or 

    // Until the next version of the standard I don't think string gurantees contigious storage. 
    // But all the current versions I know do use continious storage so it should workd. 
    file.seekg(0); 
    std::string   buffer1(size); 
    file.read(&buffer1[0],size); 
} 
0

Это больше, чем короткие решения, но, возможно, немного более эффективным, как это делает немного меньше копирования - я не проводил никаких сопоставлений времени:

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

unsigned int FileRead(istream & is, vector <char> & buff) { 
    is.read(&buff[0], buff.size()); 
    return is.gcount(); 
} 

int main() { 
    ifstream ifs("afile.dat", ios::binary); 
    const unsigned int BUFSIZE = 64 * 1024; 
    std::vector <char> buffer(BUFSIZE); 
    unsigned int n; 
    string s; 
    while(n = FileRead(ifs, buffer)) { 
     s.append(&buffer[0], n); 
    } 

    cout << s; 
} 
2

Я не вижу столько:

#include <fstream> 
#include <sstream> 
#include <string> 
using namespace std; 

int main() { 
    ifstream ifs("filename"); 
    stringstream ss; 
    ss << ifs.rdbuf(); 
    string s = ss.str(); 
} 

... как и следовало ожидать. Вам также нужна проверка ошибок.

Konrad Rudolph дал это как ответ на «связанный с этим вопрос» связан выше. Я предполагаю, что это не дубликат, так как это запрашивает кратчайший код, но ответ один и тот же. Поэтому я переписываю его здесь как wiki.

+0

Действительно ли rdbuf() делает что-то небезопасное, если «ifs» находится в плохом состоянии? (например, если файл не существует) –

+0

К сожалению, я случайно отредактировал комментарий «Вы тоже хотите проверить ошибку». Экспериментально, при моей реализации вы получаете пустую строку, поэтому она не делает ничего плохого, но вы не поймаете ошибку в вышеуказанном коде. –

0

Если вы знаете, что ваш файл содержит текст, то вы можете использовать STLSoft «s platformstl::memory_mapped_file:

platformstl::memory_mapped_file file("your-file-name"); 
std::string contents(static_cast<char const*>(file.memory()), file.size()); 

или

platformstl::memory_mapped_file file("your-file-name"); 
std::wstring contents(static_cast<wchar_t const*>(file.memory()), 
      file.size()/sizeof(wchar_t)); 

На WIndows, который оставит вашу строку, содержащую \r\n последовательности , поэтому вместо этого вы можете использовать функцию winstl::load_text_file():

std::string contents; 
winstl::load_text_file("your-file-name", contents); 

Если вы хотите загрузить в коллекцию строк, а затем использовать platformstl::read_lines():

platformstl::basic_file_lines<char> lines("your-file-name"); 
size_t n = lines.size(); 
std::string line3 = lines[3]; 
Смежные вопросы