2011-09-13 475 views
-3

我正在尝试编写一个C/C++程序,该程序用输入流读入用户输入。C++中,cin读取带有换行符的大字符串

我想在忽略空格和换行符的情况下阅读大量流。你能帮我吗?

我想用Runtime.exec()在Java中执行这个程序,并想传递一个大的XML文件。你有什么想法我怎么能意识到这一点?

cout << "Source XML:" << endl; 
char* buffer = new char[10]; 
cin.read(buffer, 10); 

输入后会产生奇怪的字符:“a \ nb \ nc \ nd \ ne \ n”。

我想在这样的阅读:

<somedata> 
    <atag>value</atag> 
    ... 
</somedata> 
+0

Ç或C++?在开始编写代码之前,选择编程语言是一个好主意... –

+0

我尝试过使用cin.ignore(),但没有得到结果。我不想指定一个分隔字符。我知道创建szenario起初听起来很愚蠢,但我可以用文件来完成,因为我没有在文件系统上写入特权。 –

+0

@Kerrek:当然是C++。抱歉。 –

回答

0

cin.read可能进入你键入的前十个字符为buffer,而不是其他。这包括尾随零。由于您在任何时候都没有添加尾随零,所以buffer的许多用法都会导致缓冲区溢出,导致未定义的行为。通常这个未定义的行为看起来像你想要的字符串后面的奇怪字符。最简单的解决方案是让数组变大一点,并将最后一个元素设置为零。这可以防止任何时候发生意外错误。

cout << "Source XML:" << endl; 
char* buffer = new char[11]; 
cin.read(buffer, 10); 
buffer[10] = '\0'; //now buffer works with ALL string functions. 

正如指出的DeadMG的评论,容器始终是一个好主意,因为异常处理,调整大小,内存管理等是自动的。

cout << "Source XML:" << endl; 
std::vector buffer(11); 
cin.read(&buffer[0], 10); // &buffer[0] is a char* 
buffer.back() = '\0'; 
+0

我制作了一个更大的阵列。将它设置为零是什么意思?我没有得到内存异常,但仍然在现在的最后怪异的字符。 –

+0

我改变了这个 \t cout <<“Source XML:”<< endl; \t char * buffer = new char [sourceXmlSize + 1]; \t buffer [sourceXmlSize] = 0; \t cin.read(buffer,sourceXmlSize); 现在不再有任何奇怪的字符。谢谢! –

+1

Downvote。始终使用资源管理类。 – Puppy

1

我不知道我理解你的问题,但是这听起来很像你只需要简单的格式化输入:

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string token; 
    while (std::cin >> token) 
    { 
    std::cout << "We read one token: " << token << std::endl; 
    // etc. 
    } 
} 

如果你想要不同的东西,请留下评论。


更新:根据另一个答案,让我再添加一件事。如果你想以二进制形式读取原始数据,而不是文本标记,那么确实使用read,但是要读入适当的缓冲区对象。如果你需要一个字符串,以后可以随时创建一个:

std::vector<char> buf(10); 
std::cin.read(buf.data(), buf.size()); // or `&buf[0]` on older platforms 
std::string str(buf.data(), buf.size()); // you can pass `str` around now 
+0

'忽略linebreaks和空白'? –

+0

格式化的输入将*跳过*换行符和空格。不知道这是OP的意思,尽管听起来像是这样,因为他想读取XML ...... –

+0

我接受了'cin.read(buffer,10)'的使用,作为澄清。 –

0

如果你想读取整个标准输入到缓冲区中,试试这个:

#include <iostream> 
#include <sstream> 

int main() { 
    using std::cout; 
    using std::endl; 
    using std::cin; 
    using std::ostringstream; 
    using std::string; 

    cout << "Source XML:" << endl; 

    ostringstream oss; 
    oss << cin.rdbuf(); 

    cout << "---\n" << oss.str() << "\n---\n"; 
    // Or, ParseXML(oss.str.c_str()); 
} 

或者,在(大致相当)替代,试试这个:

#include <iostream> 
#include <string> 
#include <map> 
#include <algorithm> 
#include <vector> 

struct all_letters: std::ctype<char> { 
    all_letters() : std::ctype<char>(get_table()) {} 
    static mask const* get_table() { 
     static std::vector<mask> rc(table_size, alpha); 
     return &rc[0]; 
    } 
}; 

int main(int ac, char **av) 
{ 
    std::cin.imbue(std::locale(std::cin.getloc(), new all_letters())); 

    std::cout << "Source XML:" << std::endl; 

    std::string input; 
    std::cin >> input; 

    std::cout << "---\n" << input << "\n---\n"; 
    // Or, ParseXML(input.c_str()); 
}