2012-04-19 35 views
0

所以這看起來像一個這樣簡單的問題,但我正在努力。我有一個大文件,我只想通過並將文件中的每個字符都放入char數組中。我的問題是我不知道如何處理新行和任何空格。有沒有辦法通過文件並抓住所有的字符,跳過換行符,並把它們放在一個數組中?C++:抓取文件中的每個字符忽略換行符和空格

是的,我在谷歌搜索周圍,但沒有運氣。

+0

閱讀基因組中,我猜? – cmo 2012-04-19 18:23:49

回答

1

這是如何在C中輕鬆完成的。我相信它也可以使用C++接口完成,但C庫也是C++的一部分。

#include <stdio.h> 
#include <ctype.h> 

FILE *f = fopen ("filename", "r"); 
if (!f) 
    error ... 

char array [BIGENOUGH]; 
int index = 0; 
while (!feof (f)) 
{ 
    char c = fgetc (f); 
    if (!isspace (c)) 
     array [index++] = c; 
} 
fclose (f): 
+0

我認爲你需要刪除EOF,這是在數組的末尾 – 2012-04-19 18:24:32

+0

這工作完美。非常感謝你。我正在嘗試使用fstream庫。這很容易。 – LiverpoolFTW 2012-04-19 18:25:28

0

首選的方法是使用標準庫字符串。從字符串中刪除空格的示例here。如何從一行文件逐行讀取here

示例代碼:

fstream file; 
file.open("test.txt",ios::in); 
while (!file.eof()) { 
    string str; 
    file >> str; 

    remove_if(str.begin(), str.end(), isspace); 
    str.erase(remove_if(str.begin(), str.end(), isspace), str.end()); 
    //save str here 
} 

file.close(); 

remove_if示例實現:

template<typename T, typename P> 
T remove_if(T beg, T end, P pred) 
{ 
    T dest = beg; 
    for (T itr = beg;itr != end; ++itr) 
     if (!pred(*itr)) 
      *(dest++) = *itr; 
    return dest; 
} 

此代碼是未經測試。

0

fgets允許您閱讀直到換行(注意換行符仍然存在於目標緩衝區中,因此請確保使用'\ 0'覆蓋它)。
逐行讀取文件,每次將輸出與前一個輸出連接起來。

1

在C++中執行所需操作的關鍵是利用格式化的輸入操作。你想忽略空白;格式化的輸入法就是這樣做的。

這裏有一種方法,採用規範的C++輸入環:

#include <fstream> 
#include <iostream> 

int main() { 
    std::ifstream inFile("input.txt"); 

    char c; 
    std::string result; 
    while(inFile >> c) 
    result.push_back(c); 

    std::cout << result; 
} 

我寧願標準算法,以手工製作環路。以下是使用std::copy在C++中執行此操作的一種方法。請注意,這種方式和第一種方式幾乎完全相同。

#include <vector> 
#include <fstream> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 

int main() { 
    std::ifstream inFile("input.txt"); 
    std::string result; 
    std::copy(std::istream_iterator<char>(inFile), 
      std::istream_iterator<char>(), 
      std::back_inserter(result)); 
    std::cout << result; 
} 

另一種方式,這次與std::accumulatestd::accumulate使用operator+而不是push_back,所以我們可以一次讀取string中的文件。

#include <vector> 
#include <fstream> 
#include <numeric> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 

int main() { 
    std::ifstream inFile("input.txt"); 
    std::string result = 
    std::accumulate(
     std::istream_iterator<std::string>(inFile), 
     std::istream_iterator<std::string>(), 
     std::string()); 
    std::cout << result; 
}