2012-05-24 100 views
1

首先我对C++的了解非常有限,这是我的第一堂课,所以这可能看起来很愚蠢,但对我忍无可忍,我会问你保持它有点简单还是很好解释提前致谢。从C++文件中读取二维字符数组

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

这里是运行代码 Welcometothetypinggame1.Typetheentiresentenceinoneline2.IstimedandwillaffectthescoreØ-™WIU {DX &那张E”©É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

的问题就在这里:

in>>a[i][x]; 

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

你需要做的就是多读未格式化的数据:

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

更多herehere

+0

感谢您快速解释的答案 –

2

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

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

甚至更​​好,放下你的字符数组,并把他们定义为字符串,并把它们放在一个动态的容器,让我们说矢量。

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

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

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

对于阅读,你需要检查你是否正在改变行和/或如果你到达文件的末尾。

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]; 
    } 
} 
0

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

相关问题