【问题标题】:C++: Grab every character of a file ignoring newlines and whitespaceC++:抓取文件的每个字符,忽略换行符和空格
【发布时间】:2012-04-19 18:16:41
【问题描述】:

所以这似乎是一个如此简单的问题,但我正在努力解决它。我有一个大文件,我想通过它并将文件中的每个字符放入一个字符数组中。我的问题是我不知道如何处理换行符和任何空格。有没有办法只浏览文件并获取所有字符,跳过换行符并将它们放入数组中?

是的,我在谷歌上搜索过,但没有运气。

【问题讨论】:

  • 读取基因组,我猜?

标签: c++ arrays char


【解决方案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):

【讨论】:

  • 我认为你需要删除数组末尾的 EOF
  • 这很完美。非常感谢您。我试图使用 fstream 库。这要容易得多。
【解决方案2】:

首选方法是使用标准库字符串。从字符串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;
}

此代码未经测试。

【讨论】:

    【解决方案3】:

    在 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;
    }
    

    比起手工循环,我更喜欢标准算法。这是在 C++ 中使用std::copy 的一种方法。请注意,这种方式和第一种方式几乎相同。

    #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;
    }
    

    【讨论】:

      【解决方案4】:

      fgets 允许您读取到换行符(请注意,换行符仍然存在于目标缓冲区中,因此请确保使用 '\0' 覆盖它)。
      逐行读取文件,每次将你的输出与前一个输出连接起来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        相关资源
        最近更新 更多