Я хочу прочитать весь файл в строку. Я использую 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] Ошибка: невозможно выполнить ссылку
Любые другие решения для чтения файла в строку?
Давайте создадим пустой VCL Форма приложения и добавить один TMemo
контроль над этим. IDE назову это Memo1
автоматически Объект Memo представляет собой текстовый редактор с двумя важными свойствами:
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 и т. Д.
Memo1->Lines
Это TStrings
класс, который содержит динамический массив String
s. В 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
это будет работать для любого файла … даже если он содержит контрольные коды.
Других решений пока нет …