C++ C++;:使用get()从文件中读取;未按预期工作

C++ C++;:使用get()从文件中读取;未按预期工作,c++,C++,假设我有一个如下所示的文件: |----------------------------------------------| | | | |---------| |--------------| | | |.........| |..............| | | |.........| |..............|

假设我有一个如下所示的文件:

|----------------------------------------------|
|                                              |
| |---------|       |--------------|           |
| |.........|       |..............|           |
| |.........|       |..............|           |
| |----+----|       |----+---------|           |
|      #                 #                     |
|      ###################                     |
|                                              |
|----------------------------------------------|
char tile[MAX_HEIGHT][MAX_WIDTH];
char c;

for(int i=0; i<MAX_HEIGHT; i++) {
    for(int j=0; j<MAX_WIDTH + 1; j++) {
        infile.get(c);
        if(c == '\n') {
            continue;
        }
        tile[i][j] = c;
    }
}
for(int i=0; y<MAX_HEIGHT; y++) {
    for(int j=0; x<MAX_WIDTH; x++) {
        cout << tile[y][x];
    }
    cout << endl;
}
(这将是游戏的地图文件)
在这种情况下,
MAX_WIDTH
为48,
MAX_HEIGHT
为10

我这样做是为了在使用
infle.unset(ios_base::skipws)

然后我在如下循环中使用了
get()

|----------------------------------------------|
|                                              |
| |---------|       |--------------|           |
| |.........|       |..............|           |
| |.........|       |..............|           |
| |----+----|       |----+---------|           |
|      #                 #                     |
|      ###################                     |
|                                              |
|----------------------------------------------|
char tile[MAX_HEIGHT][MAX_WIDTH];
char c;

for(int i=0; i<MAX_HEIGHT; i++) {
    for(int j=0; j<MAX_WIDTH + 1; j++) {
        infile.get(c);
        if(c == '\n') {
            continue;
        }
        tile[i][j] = c;
    }
}
for(int i=0; y<MAX_HEIGHT; y++) {
    for(int j=0; x<MAX_WIDTH; x++) {
        cout << tile[y][x];
    }
    cout << endl;
}
不完全是这样的

可能出了什么问题?我该怎么办

(+)打印数组的过程如下所示:

|----------------------------------------------|
|                                              |
| |---------|       |--------------|           |
| |.........|       |..............|           |
| |.........|       |..............|           |
| |----+----|       |----+---------|           |
|      #                 #                     |
|      ###################                     |
|                                              |
|----------------------------------------------|
char tile[MAX_HEIGHT][MAX_WIDTH];
char c;

for(int i=0; i<MAX_HEIGHT; i++) {
    for(int j=0; j<MAX_WIDTH + 1; j++) {
        infile.get(c);
        if(c == '\n') {
            continue;
        }
        tile[i][j] = c;
    }
}
for(int i=0; y<MAX_HEIGHT; y++) {
    for(int j=0; x<MAX_WIDTH; x++) {
        cout << tile[y][x];
    }
    cout << endl;
}

对于(inti=0;y我想应该是j
既然你的第一行是好的,问题就从你的第二行开始

尝试删除+1

编辑:

  • 移除+1
  • 阅读时,您可以尝试在两个\r\n上都添加一个检查

  • 如果输入文件中有windows样式的换行符,则需要为每个换行符读取两个字符。
    \r\n
    。这可以解释输出损坏的原因


    解决方法是使用
    std::getline
    样式的函数,而不是
    get
    。或者显式检查
    \r\n
    组合。

    您如何确定上述输出?@TimBiegeleisen您的意思是什么?向我们展示读取数组后打印数组的代码。@TimBiegeleisen我已经添加了代码!我认为king it
    for(int j=0;jt)这使得它被进一步推送。使它+2使它工作,但我不明白为什么。您使用的是Windows还是Linux?可能有\r或\n取决于您在Windows上使用升华文本并在Linux上编译的操作系统(使用PuTTY)