Ошибка при чтении файла в строке с помощью C ++ Builder Project

Я хочу прочитать весь файл в строку. Я использую Embarcadero C ++ Builder XE.

Когда я использую приведенный ниже код в моем проекте, он дает ошибки:

#include <iostream>
#include <iomanip>
#include <iterator>
#include <fstream>

std::ifstream in(Path);
std::string s((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: _ Mutex :: _ Lock ()'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: _ Mutex :: _ Unlock ()'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: char_traits :: eq_int_type (const int, const int)'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: char_traits :: not_eof (const int)'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: char_traits :: to_char_type (const int)'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: char_traits :: eof ()'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: char_traits :: to_int_type (const char)'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: locale :: id :: operator unsigned int ()'
[Ошибка ILINK32] Ошибка: Неразрешенная внешняя 'std :: locale :: name () const'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: codecvt_base :: codecvt_base (unsigned int)'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: locale :: facet :: _ Incref ()'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: ios_base :: ios_base ()'
[Ошибка ILINK32] Ошибка: Неразрешенная внешняя 'std :: ios_base :: getloc () const'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: ctype :: _ Getcat (std :: locale :: facet * *, std :: locale *)'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: ctype :: widen (char) const'
[Ошибка ILINK32] Ошибка: Неразрешенный внешний 'std :: ios_base :: rdstate () const'
[Ошибка ILINK32] Ошибка: невозможно выполнить ссылку

Любые другие решения для чтения файла в строку?

0

Решение

Давайте создадим пустой VCL Форма приложения и добавить один TMemo контроль над этим. IDE назову это Memo1 автоматически Объект Memo представляет собой текстовый редактор с двумя важными свойствами:

  1. Memo1->Text

    Text это System::String (автоматически перераспределяемый класс строки из VCL держа весь текст памятки. String имеет Length() функция возвращает количество имеющихся символов, и каждый символ доступен с помощью [] такой оператор (индексируется с 1 !!!):

    String s = _D("123456"); // set some string to s
    int l = s.Length(); // get its length
    for (int i = 1; i <= l; i++) s[i] = '0'; // change all the chars to zeros
    Memo1->Text = s; // feed it to Memo
    

    Внутри множество функций поддержки StringНаиболее важным для вас является форматированный вывод:

    Memo1->Text = String().sprintf(_D("float number: %7.3f"), float(123.456));
    

    Ты можешь использовать String как ваши локальные переменные тоже:

    String s = _D("some text");
    Memo1->Text = s;
    

    Также для обратной совместимости, если вам нужно char* для некоторых функций, затем просто назначьте String для AnsiString и назовите его c_str() метод:

    String s = _D("some text");
    AnsiString as = s;
    char *txt = as.c_str();
    

    Но остерегайтесь не перезаписывать нераспределенное пространство или использовать этот указатель после перераспределения внутри asили после as выходит за рамки. Это используется в основном как входной параметр для функций Win32 API, функций C, не-VCL LIB / DLL и т. Д.

  2. Memo1->Lines

    Это TStrings класс, который содержит динамический массив Strings. В TMemo каждый элемент представляет строку в Text, Вы можете динамически добавлять строки в Memo1 как это:

    Memo1->Lines->Add(_D("text 1"));
    Memo1->Lines->Add(_D("text 2"));
    Memo1->Lines->Add(_D("text 3"));
    

    Вы можете загрузить / сохранить все содержимое Memo следующим образом:

    Memo1->Lines->LoadFromFile("file1.txt");
    Memo1->Lines->SaveToFile("file1.txt");
    

    Любые изменения в Memo1->Lines также изменится Memo1->Textи наоборот, так как они оба представляют одно и то же. Вы можете скрыть свою заметку (невидимую) и использовать ее на тот случай, если не хотите показывать, что делаете …

Вы также можете загрузить весь файл в char[] буфер с использованием функций доступа к файлам без каких-либо VCL компонент, как это:

int hnd = FileOpen("file1.txt", fmOpenRead); // open file hnd>=0 if all OK
int siz = FileSeek(hnd, 2, 0); // point to end of file and return position = file size
FileSeek(hnd, 0, 0); // point back to start of file
char *txt = new char[siz+1] // allocate space for text and null terminator
FileRead(hnd, txt, siz); // load the file into memory at once
FileClose(hnd); // close file as we do not need it anymore

txt[siz] = 0; // add null termination just to be safe (text files do not contains zeros usually)
// do your thing with txt[siz]

delete[] txt;

Или же:

TFileStream *strm = new TFileStream("file1.txt", fmOpenRead); // open file
int siz = strm->Size; // file size
char *txt = new char[siz+1] // allocate space for text and null terminator
strm->ReadBuffer(txt, siz); // load the file into memory at once
delete strm; // close file as we do not need it anymore

// do your thing with txt[siz]

delete[] txt;

Или же:

TMemoryStream *strm = new TMemoryStream;
strm->LoadFromFile("file1.txt"); // open file

// do your thing with strm->Memory up to strm->Size bytes...

delete strm;

В отличие от std::fstreamэто будет работать для любого файла … даже если он содержит контрольные коды.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]