在C ++中从文件中读取2D char数组

时间:2012-05-24 08:10:24

标签: c++ arrays char 2d fstream

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

好的目标是我想用里面的规则创建这个文件,这样我就可以在一个单独的函数中读取它。然而,当我运行这个我没有错误,但它首先出来没有任何空格,我最后得到一些随机的ascii。

这是运行代码的结果 Welcometothetypinggame1.Typetheentiresentenceinoneline2.IstimedandwillaffectthescoreØ-™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;
}

5 个答案:

答案 0 :(得分:5)

问题在于:

in>>a[i][x];

提取运算符>>提取格式化数据。格式化数据意味着由空格(如空格)分隔的字符块。在提取期间,将忽略所有空格字符。因此,您无法使用>>运算符读取空白字符。

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

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

了解更多herehere

答案 1 :(得分:2)

请勿使用&gt;&gt;在这个特定的例子中。它从您的文件中读取格式化数据。使用

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”。

答案 2 :(得分:1)

提取算子&gt;&gt;默认情况下会忽略空格。 您可以按照其他答案中的建议读取未格式化的数据 或者你可以改变这样的默认行为:

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

答案 3 :(得分:0)

第1部分

  

它首先出现没有空格

问题出在这里

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

您只编写数据,而不是格式化输出。

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

  1. 使用<iomanip>并使用setwsetfill
  2. 在每个条目之后(或之前)添加一个空格。
  3. 第二个选项的示例:

    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是向量的向量而不是char数组,这是一个解决方案。我不想使用阵列。)

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

    相反,对于阅读,您需要检查是否要更改行和/或是否到达文件的末尾。

答案 4 :(得分:0)

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