2017-06-06 136 views
0

我想将整个文件读入字符串。我正在使用Embarcadero C++ Builder XE。使用C++ Builder项目读取字符串中的文件时出现错误

当我使用我的项目中下面的代码,它给错误:

#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 Error] Error: Unresolved external 'std::_Mutex::_Lock()' 
[ILINK32 Error] Error: Unresolved external 'std::_Mutex::_Unlock()' 
[ILINK32 Error] Error: Unresolved external 'std::char_traits::eq_int_type(const int&, const int&)' 
[ILINK32 Error] Error: Unresolved external 'std::char_traits::not_eof(const int&)' 
[ILINK32 Error] Error: Unresolved external 'std::char_traits::to_char_type(const int&)' 
[ILINK32 Error] Error: Unresolved external 'std::char_traits::eof()' 
[ILINK32 Error] Error: Unresolved external 'std::char_traits::to_int_type(const char&)' 
[ILINK32 Error] Error: Unresolved external 'std::locale::id::operator unsigned int()' 
[ILINK32 Error] Error: Unresolved external 'std::locale::name() const' 
[ILINK32 Error] Error: Unresolved external 'std::codecvt_base::codecvt_base(unsigned int)' 
[ILINK32 Error] Error: Unresolved external 'std::locale::facet::_Incref()' 
[ILINK32 Error] Error: Unresolved external 'std::ios_base::ios_base()' 
[ILINK32 Error] Error: Unresolved external 'std::ios_base::getloc() const' 
[ILINK32 Error] Error: Unresolved external 'std::ctype::_Getcat(std::locale::facet * *, std::locale *)' 
[ILINK32 Error] Error: Unresolved external 'std::ctype::widen(char) const' 
[ILINK32 Error] Error: Unresolved external 'std::ios_base::rdstate() const' 
[ILINK32 Error] Error: Unable to perform link 

用于读取文件到String的任何其他解决办法?

+1

检查您的图书馆路径。也许你的标准库有一些配置问题。 – Devolus

+0

@Devolus:Intsand ifstream,在Borland C++,RAD XE Embarcadero IDE中是否有读取文件的文件? –

+0

您的问题不是标准库函数,而是您的设置。作为一个旁注,无论如何你发布的并不是一个合适的C++代码,所以你应该发布一个完整的例子。 – Devolus

回答

0

让我们创建一个空的VCL表单应用程序并添加一个单一的TMemo控件。 IDE将自动命名为Memo1。备忘录对象是一个文本编辑器,2个重要特性:

  1. Memo1->Text

    TextVCL一个System::String(自动reallocable字符串类控股备忘录的全文StringLength()函数返回存在的字符数,并且使用这样的[]运算符来访问每个字符(索引从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 LIBS/DLL的输入参数等

  2. 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")); 
    

    您可以加载/保存整个备忘录的内容是这样的:

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

    Memo1->Lines的任何变化也将改变Memo1->Text,反之亦然,如他们都代表同样的事情。你可以将你的备忘录隐藏(不可见),并仍然使用它,以防你不想显示你在做什么......

您还可以使用文件访问功能,无需任何VCL组件,这样整个文件加载到char[]缓冲:

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不同,这些将适用于任何文件...即使持有控制代码。

+1

“*'文本'是'AnsiString' *” - 不,它不是。它是一个'System :: String',在包含XE的C++ Builder 2009及更高版本中,'System :: String'是System :: UnicodeString的别名,而不是'System :: AnsiString'。因此,'char * txt = Memo1-> Text.c.str();'不会编译(无论如何它是危险的,因为当语句完成时'txt'将指向无效内存)。另外,'Memo1-> Text [i] ='0';'对Memo没有任何影响,因为它正在修改'Text' getter返回的一个临时'String'对象。 –

+0

@RemyLebeau它应该是'c_str()'粗糙的漂亮的抓住,但是正确的'文本'属性是不一样'AnsiString'我偏向于我使用BCB和BDS,没有经验与XE。将很快修复我的错误 – Spektre

+0

“*你可以让你的备忘录隐藏(不可见),并仍然使用它,如果你不想显示你在做什么*” - 使用TStringList类代替。不要将视觉控件用于非视觉工作。 –

相关问题