【问题标题】:Reading char by char from a file and concatenate the result into an array of chars从文件中逐个字符地读取字符并将结果连接到一个字符数组中
【发布时间】:2013-04-07 10:48:39
【问题描述】:

我有一个文本文件并逐个字符地读取它。 但我想连接这些字符并有一个数组 字符。

据我所知,我应该使用 strcat。 但我无法将从文件中读取的字符转换为 const char* 以便我可以使用 strcat:

char * strcat (char * 目的地, const char * 源);

在调试器中,我可以看到 chr 有“Bad Ptr”。你会好心帮助我吗?

ifstream infile;
infile.open( "Gmv.txt", ifstream::in);

char result[1000]; 

while (infile.good())
{       
    character = infile.get();
    const char * chr = reinterpret_cast<const char *>(character);
    strcat(result, chr);
}   
infile.close();

【问题讨论】:

  • 逐字符读取文件效率不高,顺便说一句。您应该大块地读入缓冲区。
  • 提示:不要循环 while (infile.good())while (!infile.eof())。除非您在循环内进行额外检查,否则它将循环一次到多次。原因是当您读取并点击文件末尾时,文件结束标志是 not 设置的。相反,它被设置为您尝试阅读的下一次。不幸的是,逐个字符读取会有点困难,因为您必须在读取字符后添加检查,如果出现错误或文件结束条件,则退出循环。

标签: c++


【解决方案1】:

假设您的文件是 999 个字符或更少,这应该可以工作(没有添加错误检查)。 没有必要使用 strcat。其实这里用strcat很傻。

ifstream infile;
infile.open( "Gmv.txt", ifstream::in);

char result[1000]; 
int i = 0;
while (infile.good())
{       
    result[i] = infile.get();
    ++i;
}

result[i] = 0; // Add the '\0' at the end of the char array read.

infile.close();

strcat 将一个以 0 ('\0') 结尾的字符数组作为第二个参数。你的 char 没有被 0 终止。因此你得到了错误的指针错误。

顺便说一句,你可以缩短这个时间

while (infile)
    result[i++] = infile.get();

【讨论】:

  • 谢谢,这就是我想要的。您能否澄清一下 result[i] = 0 的必要性?我试过有没有它。没有它,当我运行 cout
  • 大多数 C 和 C++ 函数都希望在 char 数组的末尾有一个 '\0'(与 0 相同),以便它们知道数组的结束位置。 cout 还使用 '\0' 来查找数组的结尾。如果不加 0,cout 会一直打印,直到找到自然出现的 0。
【解决方案2】:

当C++有std::string时,为什么要用数组作为字符串:

std::string result;
char ch;

while (infile >> ch)
    result += ch;

【讨论】:

  • 教师因不明原因禁止初学者使用字符串。
  • @Trts 有很好的理由。底层字符串实现是一个数组。这样的字符串类将所有这些抽象出来,因此您永远无法欣赏或理解引擎盖下发生的事情以使您的代码正常工作。此外,有时您不能使用字符串,必须依赖基础。
猜你喜欢
  • 2019-11-11
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2017-11-15
  • 1970-01-01
  • 2017-09-29
相关资源
最近更新 更多