簡體   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