如何在C+中逐字读取文本文件+; 我想知道有没有人能帮我弄明白如何从C++中的文本文件中读取字符。这样,我就可以有一个while循环(虽然还有文本),在这个循环中,我将文本文档中的下一个字符存储在一个temp变量中,这样我就可以对它做一些事情,然后对下一个字符重复这个过程。我知道如何打开文件和所有内容,但是temp=textFile.getchar()似乎不起作用。提前谢谢。
Re:如何在C+中逐字读取文本文件+; 我想知道有没有人能帮我弄明白如何从C++中的文本文件中读取字符。这样,我就可以有一个while循环(虽然还有文本),在这个循环中,我将文本文档中的下一个字符存储在一个temp变量中,这样我就可以对它做一些事情,然后对下一个字符重复这个过程。我知道如何打开文件和所有内容,但是temp=textFile.getchar()似乎不起作用。提前谢谢。,c++,file,text,character,C++,File,Text,Character,Re:textFile.getch(),这是你编造的,还是你有参考资料说它应该有效?如果是后者,就扔掉它。如果是前者,不要那样做。得到一份好的推荐信 char ch; textFile.unsetf(ios_base::skipws); textFile >> ch; 您可以尝试以下方法: char ch; fstream fin("file", fstream::in); while (fin >> noskipws >> ch) { cout &
textFile.getch()
,这是你编造的,还是你有参考资料说它应该有效?如果是后者,就扔掉它。如果是前者,不要那样做。得到一份好的推荐信
char ch;
textFile.unsetf(ios_base::skipws);
textFile >> ch;
您可以尝试以下方法:
char ch;
fstream fin("file", fstream::in);
while (fin >> noskipws >> ch) {
cout << ch; // Or whatever
}
charch;
fstream-fin(“文件”,fstream::in);
而(fin>>noskipws>>ch){
cout假设temp
是char
并且textFile
是std::fstream
的派生
您要查找的语法是
textFile.get( temp );
在C++中没有理由不使用C<代码> <代码>,实际上它通常是最佳的选择。
#include <stdio.h>
int
main() // (void) not necessary in C++
{
int c;
while ((c = getchar()) != EOF) {
// do something with 'c' here
}
return 0; // technically not necessary in C++ but still good style
}
#包括
int
()//(空)在C++中不需要
{
INTC;
而((c=getchar())!=EOF){
//在这里用“c”做点什么
}
返回0;/在技术上没有必要在C++中,但仍然不错的风格
}
引用Bjarne Stroustrup的话:“该>>运算符用于格式化输入,即读取预期类型和格式的对象。如果不需要这样做,并且我们希望将字符作为字符读取,然后对其进行检查,则使用get()函数。”
@cnicutar和@Pete Becker已经指出了使用noskipws
/unsettingskipws
一次读取一个字符而不跳过输入中的空白字符的可能性
另一种可能是使用istreambuf_迭代器
读取数据。除此之外,我通常会使用标准算法,如std::transform
来进行读取和处理
举个例子,假设我们想做一个类似于凯撒的密码,从标准输入复制到标准输出,但每个大写字符加上3,所以a
将变成D
,B
可以变成E
,等等。(最后,它会将XYZ
转换为ABC
)
如果我们要在C中这样做,我们通常会使用如下循环:
int ch;
while (EOF != (ch = getchar())) {
if (isupper(ch))
ch = ((ch - 'A') +3) % 26 + 'A';
putchar(ch);
}
std::transform(std::istreambuf_iterator<char>(std::cin),
std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>(std::cout),
[](int ch) { return isupper(ch) ? ((ch - 'A') + 3) % 26 + 'A' : ch;});
在C++中做同样的事情,我可能会编写代码更像这样:
int ch;
while (EOF != (ch = getchar())) {
if (isupper(ch))
ch = ((ch - 'A') +3) % 26 + 'A';
putchar(ch);
}
std::transform(std::istreambuf_iterator<char>(std::cin),
std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>(std::cout),
[](int ch) { return isupper(ch) ? ((ch - 'A') + 3) % 26 + 'A' : ch;});
std::transform(std::istreambuf_迭代器(std::cin),
std::istreambuf_迭代器(),
std::ostreambuf_迭代器(std::cout),
[](int-ch){return isupper(ch)?((ch-'A')+3)%26+'A':ch;});
通过这种方式,您将接收连续字符作为传递给lambda函数(在本例中)的参数值(如果愿意,您可以使用显式函子而不是lambda)。//变量
_文件的char END_='#';
字符单字符;
//从输入文件中获取字符
获取(单字符);
//读取文件,直到到达#
//当读取指针读取#时,它将退出循环
//这要求在文本文件中最后一个字符是#号
while(singleCharacter!=文件的结尾)
{
CUT< P>这是一个C++的时尚功能,可以用来读取文件char。
void readCharFile(string &filePath) {
ifstream in(filePath);
char c;
if(in.is_open()) {
while(in.good()) {
in.get(c);
// Play with the data
}
}
if(!in.eof() && in.fail())
cout << "error reading " << filePath << endl;
in.close();
}
void readCharFile(字符串和文件路径){
ifstream-in(文件路径);
字符c;
if(in.is_open()){
while(in.good()){
in.get(c);
//玩弄数据
}
}
如果(!in.eof()&&in.fail())
是的。这就是@cnicular使用noskipws
的原因。我刚刚编辑了我的来解决这个问题。@PeteBecker是的,我喜欢它,因为这就是C
读取单个字符时所做的。你放在那里的参数noskipws
就是我要找的。旧线程,等等。但问题是“来自文件”您不能使用getchar
读取stdin以外的任何内容。getc
是您想要的;您必须在某个地方打开一个文件指针。