【问题标题】:Reading a 2D char array from file in C++从 C++ 文件中读取二维字符数组
【发布时间】:2012-05-30 19:19:29
【问题描述】:

首先,我对 c++ 的了解非常有限,这是我的第一堂课,所以这可能看起来很愚蠢,但请耐心等待,我想请你保持简单或解释清楚,提前谢谢。

好的,我的目标是创建这个包含规则的文件,以便我可以在单独的函数中读取它。但是,当我运行它时,我没有收到任何错误,但它首先出现时根本没有空格,最后我得到一些随机的 ascii。

这是运行代码的结果 欢迎来到打字游戏1.在一行中键入整个句子2.Istimed and willaffectthescoreØ-™wîú{ Dx&a¼ Ë' ©ÉaDx&a®pa

#include <cstdlib>
#include <fstream>
#include <iostream>

int main(int argc, char** argv) {
//set the sentences i want the file to print
char o[3][40]={"Welcome to the typing game             ",
            "1. Type the entire sentence in one line",
            "2. Is timed and will affect the score  "};

//creating the file to read in
ofstream out;
out.open("rules.txt");
for(int i=0;i<3;i++){
    for(int x=0; x<39; x++){
        out<<o[i][x];
    }
    out<<"\n";
}
out.close();


//creating a new array to read the data that was stored above
char a[3][40];
ifstream in;
in.open("rules.txt");
for(int i=0;i<3;i++){
    for(int x=0; x<40; x++){
        in>>a[i][x];
    }
}
in.close();

//and just printing out the array to see the results
for(int i=0;i<3;i++){
    for(int x=0; x<40; x++){
        cout<<a[i][x];
    }
}
return 0;
}

【问题讨论】:

    标签: c++ arrays char 2d fstream


    【解决方案1】:

    问题出在这里:

    in>>a[i][x];
    

    提取运算符&gt;&gt; 提取格式化数据。格式化数据是指由空格(如空格)分隔的字符块。在提取过程中,所有空白字符都将被忽略。因此,您无法使用 &gt;&gt; 运算符读取空白字符。

    您需要做的是读取为未格式化的数据:

    in.get(a[i][x]);
    

    阅读更多 herehere

    【讨论】:

    • 感谢您快速解释清楚的答案
    【解决方案2】:

    在此特定示例中不要使用 >>。它从您的文件中读取格式化数据。要么使用

    in.get(a[i][x]);
    

    或者更好的是,删除您的 char 数组并将它们声明为字符串,然后将它们放入动态容器中,比如向量。

    ifstream in("rules.txt");
    vector<string> myLines;
    while (!in.eof()) {
        string temp;
        getline(in,temp);
        myLines.push_back(temp);
    }
    

    现在您将所有规则都存储在一个向量中的单独字符串中。将它们写入文件也很容易。当您使用 for 循环从 0 到 40 进行迭代,并且字符串不是 40 个字符长时,您会得到“随机 ascii”。

    【讨论】:

      【解决方案3】:

      默认情况下,提取运算符 >> 将忽略空格。 您可以按照其他答案中的建议读取未格式化的数据 或者您可以像这样更改默认行为:

      in.open("rules.txt");
      in >> noskipws;
      for(int i=0;i<3;i++){
          for(int x=0; x<40; x++){
              in>>a[i][x];
          }
      }
      

      【讨论】:

        【解决方案4】:

        第 1 部分

        它首先出现,没有空格

        问题来了

        for(int x=0; x<39; x++){
           out<<o[i][x];
        }
        

        你只写数据,你不格式化你的输出。

        您有两种可能的解决方案:

        1. 使用&lt;iomanip&gt; 并使用setwsetfill
        2. 在每个条目之后(或之前)添加一个空格。

        第二个选项的示例:

        for(int x=0; x<39; x++) {
            out << o[i][x] <<" ";
        }
        

        显然,这也会在最后一个条目之后(或在第一个条目之前)放置空格。如果您不想这样做,则需要额外的代码。

        第 2 部分

        最后我得到了一些随机的ASCII码

        问题(正如其他人所说)出在此处:

        for(int i=0;i<3;i++){
            for(int x=0; x<39; x++)
        

        您任意限制/增加您的输出,而不考虑您必须写入/读取的变量的实际大小。

        对于写入(屏幕或文件相同),您应该执行类似的操作(请注意,如果o 是向量的向量,而不是字符数组,这是一个解决方案。我不喜欢使用数组。 )

        for(int i=0;i<o.size();i++){
            for(int x=0; x<o[0].size(); x++)
        

        对于阅读,您需要检查是否正在换行和/或是否已到达文件末尾。

        【讨论】:

          【解决方案5】:

          如果我没记错的话,每行末尾缺少 /n 会阻止“自动换行”,它会全部出现在一行上。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多