1

首先,我对 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;
}
4

5 回答 5

5

问题出在这里:

in>>a[i][x];

提取运算符>>提取格式化数据。格式化数据是指由空格(如空格)分隔的字符块。在提取过程中,所有空白字符都将被忽略。所以你不能使用>>运算符读取空白字符。

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

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

在此处此处阅读更多信息。

于 2012-05-24T08:27:28.807 回答
2

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

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 个字符长时,您会得到“随机 ascii”。

于 2012-05-24T08:31:29.843 回答
1

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

in.open("rules.txt");
in >> noskipws;
for(int i=0;i<3;i++){
    for(int x=0; x<40; x++){
        in>>a[i][x];
    }
}
于 2012-05-24T09:24:15.147 回答
0

第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++)

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

于 2012-05-24T08:47:27.687 回答
0

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

于 2012-07-02T15:03:25.673 回答