繁体   English   中英

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

[英]Reading a 2D char array from file in C++

首先,我对C ++的知识非常有限,这是我的第一堂课,因此,这看起来可能很愚蠢,但请耐心等待,我想请您将其保持简单或预先解释好。

确定的目标是我想使用内部规则创建此文件,以便可以在单独的函数中读取它。 但是,当我运行此程序时,我没有出现任何错误,但首先出现的结果是完全没有空格,最后我得到了一些随机的ascii。

这是运行代码Welcometothetypinggame1.Typeinentilineinoneline2.Istimedand将影响分数Ø-™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;
}

问题出在这里:

in>>a[i][x];

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

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

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

在这里这里阅读更多。

在此特定示例中,请勿使用>>。 它从文件中读取格式化的数据。 无论使用

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

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

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

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

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

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

第1部分

首先出来没有空格

问题在这里

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

您只写入数据,并且不格式化输出。

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

  1. 使用<iomanip>并使用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是向量的向量,而不是char数组,则这是一个解决方案。我不希望使用数组。)

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

为了阅读,您需要检查是否要更改行和/或是否已到达文件末尾。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM