2

我被要求从标准中读取文件,例如:

./gscheck < testfile

其中 gscheck 是我编译的可执行文件的名称。无论如何,我需要使用函数 cin.getline() 将每一行读入一个字符数组。我知道该怎么做

char line[250];
while (cin.getline(line, 250))
{
    Do stuff;
}

但最终,我不想每行做任何事情,我想将每一行连接成一个巨大的字符数组。如何使用上述方法创建一个更大的字符数组,该数组按顺序包含每一行并包含换行符,这样我基本上是从文件中“啜饮”,然后逐个字符地解析它,但不使用字符串类。

4

4 回答 4

1

根据@KerrekSB 的回答,您可以使用 deprecated std::ostrstream,它使用字符数组(实际上是 a char *,但strlen您可以轻松地将其作为数组工作)。

std::ostrstream oss;
oss <<std::cin.rdbuf();
return oss.str();
于 2012-10-01T01:04:31.520 回答
1

以防万一您有不使用动态内存的限制,确定使用哪个 std::string :

char a[VERY_BIG_SIZE_ENOUGH_FOR_FILE];
std::cin.read(a, VERY_BIG_SIZE_JUST_ENOUGH_FOR_FILE - 1);
a[VERY_BIG_SIZE_JUST_ENOUGH_FOR_FILE - 1] = '\0';
于 2012-10-01T01:01:19.340 回答
1

那么这个怎么样:

char file[2000];
char *end=file+1998;
char *ptr=file;
while (!cin.eof() && ptr < end) {
  cin.getline(ptr, end-ptr)
  ptr += strlen(ptr);
  *ptr++ = "\n";
  *ptr = 0;
}
于 2012-10-01T00:58:17.970 回答
0

不要这样做。

拒绝吧。

不要使用“字符数组”。

严重地。

使用std::string.

std::string result;

for (std::string line; std::getline(std::cin, line); )
{
    result += line;
}

但是,如果您只想读取所有内容而不是实际解析行(而是保留换行符),则直接访问输入缓冲区可能会更简单:

std::ostringstream oss;
oss << std::cin.rdbuf();
return oss.str();
于 2012-10-01T00:48:26.450 回答