Zeilenumbrüche



  • Hey Leute ich wollte euch fragen ob es eine Regel für meinen Code gibt die bestimmt das ich nach jeder neuen zeile ein << Hinzufügen muss oder es auch so ok ist:

    std::ofstream properties;
            properties.open("anwendungs.properties");
            properties << "....\n"
                                /* << ?*/ "....\n"
                                "....\n"
                                "....\n"
                                "....\n"
                                "....\n";
            properties.close();
    

  • Mod

    Das Verhalten dürfte praktisch equivalent sein. In deinem Code werden direkt hintereinanderliegende String-Literale zu einem einzigen aneinandergehängt, welches dann ausgegeben wird. Wenn du jedes mal eine neue insertion nutzt, d.h. << öfter wiederholst, wird jede Zeile einzeln ausgegeben. Der Effekt dürfte der gleiche sein - aber wie immer ist Konsequenz das Zauberwort, mische das möglichst nicht in einem Projekt!

    Persönlich finde ich es lesbarer wie du es schreibst, aber auch nur wenn ordentlich formattiert wird.

    properties << "....\n"
                          "....\n"
                          "....\n"
                          "....\n"
                          "....\n"
                          "....\n";
    

    Vielleicht wären auch rohe Stringliterale für einige Szenarieren nützlicher:

    properties <<
    R"(....
    ....
    ....
    ....
    ....
    ....
    )";
    


  • Hier eine Möglichkeit, rohe Stringliterale und Einrückung zu benutzen:

    #include <iostream>
    #include <cassert>
    
    template <typename T, size_t N>
    struct constexpr_string {
      constexpr constexpr_string() =default;
      constexpr constexpr_string(constexpr_string const&) =default;
      constexpr constexpr_string(constexpr_string&&) =default;
      T data[N] = {};
      size_t n = 0;
    
      constexpr void push_back(T x) {
        data[n++] = x;
        data[n] = T();
      }
    
      constexpr operator const T*() const { return &data[0]; }
    };
    
    template <size_t N>
    constexpr constexpr_string<char, N> gobble(const char (&arr)[N]) {
      assert(arr[0] == '\n');
      size_t spaces = 0;
      while (arr[spaces+1] == ' ')
        ++spaces;
    
      size_t column = 0;
      bool eat_spaces = true;
    
      constexpr_string<char, N> res;
    
      for (const char *p=arr+1; *p; ++p) {
        if (*p == '\n') {
          column = 0;
          res.push_back(*p);
          eat_spaces = true;
          continue;
        }
    
        if (++column > spaces)
          eat_spaces = false;
        if (*p != ' ')
          eat_spaces = false;
    
        if (!eat_spaces)
          res.push_back(*p);
      }
      return res;
    }
    
    int main() {
      constexpr auto r = gobble(R"(
                                   a
                                    b
                                   c)");
      std::cout << r << '\n';
    }
    

Anmelden zum Antworten