正在阅读。C++文件
假设我有以下文件:wow.txt 4 a 1 c 我想做的是输出以下内容: d 1 a 3 将整数更改为对应的字母表d是第4个字母,a是第1个字母 在字母表中,将字母和字母对应为整数 a是字母表中的第一个字母,c是字母表中的第三个字母正在阅读。C++文件,c++,file-io,C++,File Io,假设我有以下文件:wow.txt 4 a 1 c 我想做的是输出以下内容: d 1 a 3 将整数更改为对应的字母表d是第4个字母,a是第1个字母 在字母表中,将字母和字母对应为整数 a是字母表中的第一个字母,c是字母表中的第三个字母 我从C++中的下面代码开始。 int main() { ifstream inFile; inFile.open("wow.txt"); ofstream outFile; outFile.open("sample.txt"); int k, g; char a
我从C++中的下面代码开始。
int main()
{
ifstream inFile;
inFile.open("wow.txt");
ofstream outFile;
outFile.open("sample.txt");
int k, g;
char a, b;
inFile>>k>>a>>g>>b;
outFile<<(char)(k+96)<<(int)a-96<<(char)(g+96)<<(int)b-96
}
inFile.close();
outFile.close();
}
但是在这里,我只能这样做,因为我知道wow.txt中的文本
变为整数、字符、整数、字符。
而且,即使我知道模式,如果wow.txt中的文本是超长的,那么
我不可能用我用的方法手动解决这个问题
在每个输入中键入定义k、g为整数,a、b为字符,以及
然后做infle>>k>>a>>g>>b
而且,我不知道模式,没有办法
我本来可以解决的。我想知道是否有C++
函数,该函数从给定的文本文件中读取输入并确定其类型,因此
我可以在更一般的情况下解决这类问题。
我对C++编程语言或编程一般都很陌生,
因此,如果您对此有任何帮助,我们将不胜感激。您正在搜索的术语是解析。这是一种吸收文本并将其转化为有意义内容的想法。例如,C++编译器完全按照程序的代码进行操作——它以文本形式读取,将其解析为一系列内部表达式,并对其进行转换,然后输出二进制代码,当运行时,执行所编写代码的意图。 在您的例子中,您希望将问题迎刃而解,而不是告诉输入流下一步将从文件中得到什么,您只需将所有内容提取为文本,然后自己解决问题—让输入流告诉您存在什么。如果你想一想,它是文本,或者更确切地说,是二进制数据,但无论如何都足够接近,即使你要求从流中读取一个整数——在这种情况下,流为你进行整数解析,但它仍然只是被解析的文本 下面是一些未经测试的示例代码,可以帮助您开始:
std::ifstream fin("wow.txt");
// Read everything in (works well for short files; longer
// ones could be read incrementally (streamed), but this
// adds complexity
fin.seekg(0, fin.end);
std::size_t size = fin.tellg();
fin.seekg(0, fin.beg);
std::vector<char> text(size);
fin.read(&size[0], size);
fin.close();
// Now 'tokenize' the text (into words, in this case characters)
enum TokenType { Letter, Number };
struct Token {
const char* pos;
std::size_t length;
TokenType type;
};
std::vector<Token> tokens;
for (const char* pos = &text[0]; pos != &text[0] + text.size(); ++pos) {
if (*pos >= 'a' && *pos <= 'z') {
// Letter! (lowercase)
Token tok = { pos, 1, Letter };
tokens.push_back(tok);
// TODO: Validate that the next character is whitespace (or EOF)
}
else if (*pos >= '0' && *pos <= '9') {
Token tok = { pos, 1, Number };
while (*pos >= '0' && *pos <= '9') {
++pos;
++tok.length;
}
tokens.push_back(tok);
// TODO: Validate that the next character is whitespace (or EOF)
}
else if (*pos == ' ' || *pos == '\t' || *pos == '\r' || *pos == '\n') {
// Whitespace, skip
// Note that newlines are normally tracked in order to give
// the correct line number in error messages
}
else {
std::cerr << "Unexpected character "
<< *pos
<< " at position "
<< (pos - &text[0]) << std::endl;
}
}
// Now that we have tokens, we can transform them into the desired output
std::ofstream fout("sample.txt");
for (auto it = tokens.begin(); it != tokens.end(); ++it) {
if (it->type == Letter) {
fout << static_cast<int>(*(it->pos) - 'a') + 1;
}
else {
int num = 0;
for (int i = 0; i != tok.length; ++i) {
num = num * 10 + (tok.pos[i] - '0');
}
// TODO: Make sure number is within bounds
fout << static_cast<char>(num - 1 + 'a');
}
fout << ' ';
}
fout.close();
这很难。祝你好运。查阅循环的概念,它可能在你的编程生涯中有用一两次。试着一次读取一个字符的文本文件,并将其转换为正确的格式。e、 例如,如果char是整数0,1,2,3,4,5,6,7,8,9,则转换为alpha,反之亦然