2012-05-24 207 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',它會全部出現在一行上。

相關問題