正在阅读。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

假设我有以下文件: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, 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,反之亦然