2016-09-25 168 views
-1

我在C++和編程方面頗爲新穎,所以很抱歉在我的問題中重複。我有3行文本文件:從文件中讀取字符並寫入另一個文件

7 

00000000000000000000000 * 0000

0 0 0 R 0

我需要做的是閱讀二號線,並將其寫入到一個數組爲char什麼。但我不能包含第三行,因爲它會轉到一個完全不同的矩陣。我的代碼到目前爲止:

ifstream input; 
input.open("input1.txt"); 
input >> start; 
char a=0; 
string line; 
while (getline(input, line)) 
{ 
    a=0; 
    istringstream iss(line); 
    int length = line.size(); 
    for (int i=0; i<length; i++) 
    { 
     iss >> a; 
     A[i] = a; 
     cout << A[i] << " " << i << endl; 
    } 
} 
input.close(); 

但是,有了這段代碼,它總是爲第3行啓動新數組。我究竟做錯了什麼?解決它的最簡單方法是什麼?謝謝。

-----------------------------更新---------------- ----------------------

我修改了代碼,但仍無法正常工作。我得到了這樣的結果:5)-└而不是正確的。我當前的代碼:

void Read(int &numLines, int &start, vector<char>&A, char B[][5]) 
{ 
ifstream input; 
input.open("input.txt"); 
input >> start; 
input.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
string line; 
if(getline(input, line)) 
{ 
    for(char temp: line) 
    { 
     A.push_back(temp); 
    } 
} 
input.close(); 

}

A這裏就是我想通過焦炭 Start寫2號線到,焦矢量就是一個整數,其中我存儲一號線(7)

非常感謝您的建議

+2

你是什麼意思「開始新陣列」?什麼是'A'?你的[MCVE]在哪裏? –

+0

由於'while'循環一直保持讀取直到文件結束,因此將每行解析到'A'數組中,從邏輯上講,'A'數組最後將具有文件中最後一行的解析內容。 –

+0

也正在讀入'int'的第一行嗎? –

回答

0

混合>>std::getline是非平凡的。例如,在input >> start;之後,行標記的結尾保留在流中以防止仍然需要。在你的情況下,它不是,並在隨後調用getline時被挑選出來,導致讀取空行。

這是使您的閱讀複雜化line並迫使while循環並測試空行。

通過您的程序與您的development environment's debugger一步,你會看到我在說什麼。習慣使用調試器。這可能是您遇到過的最好的編程生產力工具。

解決它最簡單的方法是將

input.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

input >> start; 

吃起來線(和其他任何可能會在該行的末尾。這就需要#include<limits>得到std::numeric_limits<std::streamsize>::max

然後你可以刪除while循環並用

代替它
if (getline(input, line)) 

沒有循環,沒有從文件中消耗多行的機會。閱讀和處理第三行的邏輯可以遵循。

邊注:不是說for循環,考慮

int i = 0; 
while (iss >> a) 
{ 
    A[i] = a; 
    cout << A[i] << " " << i << endl; 
    i++; 
} 

這將通過iss遊行,直至碰到行的末尾。您也可以將iss完全排除,並直接從line中讀取字符。

int i = 0; 
for(char temp: line) 
{ 
    A[i] = temp; 
} 

而且A可能應該是一個vector,如果它是不是已經減少緩衝區溢出的機會。

for(char temp: line) 
{ 
    A.push_back(temp); 
} 
+0

非常感謝您的解釋和建議!我已更新我的代碼(併發布它),但它仍然無法正常工作。一個輸入文件導致非常奇怪的結果和其他崩潰程序完全。你介意看看什麼是錯的? –

+0

@ A.黑色2建議:1.問一個新問題通常比添加一箇舊問題要好。那些可能會回答新問題的人可能會讀到這個問題,並且不會再閱讀它來查看更新。 2.需要更多信息。我們看到一個功能,並被告知程序崩潰。但崩潰在哪裏?不知道,不能回答。你需要製作一張[mcve]。 – user4581301

0

我會去像這樣的東西:

std::string start; 
std::string Astring; 
ifstream input; 
input.open("input.txt"); 
input >> start; 
input >> Astring; 

// If you really want a char array 
char * A = new char[Astring.size()]; 
for (unsigned int i = 0; i < Astring.size(); i++) { 
    A[i] = Astring[i]; 
} 
// Don't forget to delete after use 
delete[] A; 

而且,如果你只需要字符數組作爲輸入到別的東西后,可以打電話Astring.c_str()而不是for循環中,這返回一個C風格的字符數組。

+0

噢,寫得很快。我會解決這個問題。感謝您指出! – Cedric

相關問題