user42151: Poking through the example code of SDFS, I saw the following:
static ArduinoOutStream cout(Serial);
// F stores strings in flash to save RAM
cout << F("\ntype any character to start\n");

What exactly is << doing in this case? Moreover, F seems to never be defined prior to this. This seems like a useful trick, but I don't understand how it works.
full code available here: https://github.com/greiman/SdFs/blob/master/examples/SdInfo/SdInfo.ino

user8033: To address your confusion with the bitshift operator;
It indeed is commonly used as a the arithmetic operator for bitshift, but appears to be 'overloaded', so that when used with streams, it is an 'insertion operator'. 

In particular, stream insertion and stream extraction overloads of
  operator<< and operator>> return T&.

https://en.cppreference.com/w/cpp/language/operator_arithmetic
Basically there would be two definitions of the "<<" operator function:
function <<(integer){//Shift bits}
function <<(stream){//Join streams}


user4143: 
What exactly is << doing in this case?

It's directing the data into an output device (stream).

http://www.cplusplus.com/doc/tutorial/basic_io/

Yes, it's confusing using the same symbols for more than one thing...

Moreover, F seems to never be defined prior to this.

F() is a macro. It's defined by the Arduino core in WString.h:
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))


42151: <p>Poking through the example code of SDFS, I saw the following:</p>

<pre><code>static ArduinoOutStream cout(Serial);
// F stores strings in flash to save RAM
cout &lt;&lt; F("\ntype any character to start\n");
</code></pre>

<p>What exactly is &lt;&lt; doing in this case? Moreover, F seems to never be defined prior to this. This seems like a useful trick, but I don't understand how it works.</p>

<p>full code available here: <a href="https://github.com/greiman/SdFs/blob/master/examples/SdInfo/SdInfo.ino" rel="nofollow noreferrer">https://github.com/greiman/SdFs/blob/master/examples/SdInfo/SdInfo.ino</a></p>
 8033: <p>To address your confusion with the bitshift operator;</p>

<p>It indeed is commonly used as a the arithmetic operator for bitshift, but appears to be 'overloaded', so that when used with streams, it is an 'insertion operator'. </p>

<blockquote>
  <p>In particular, stream insertion and stream extraction overloads of
  operator&lt;&lt; and operator>> return T&amp;.</p>
</blockquote>

<p><a href="https://en.cppreference.com/w/cpp/language/operator_arithmetic" rel="nofollow noreferrer">https://en.cppreference.com/w/cpp/language/operator_arithmetic</a></p>

<p>Basically there would be two definitions of the "&lt;&lt;" operator function:</p>

<pre><code>function &lt;&lt;(integer){//Shift bits}
function &lt;&lt;(stream){//Join streams}
</code></pre>
 4143: <blockquote>
  <p>What exactly is &lt;&lt; doing in this case?</p>
</blockquote>

<p>It's directing the data into an output device (stream).</p>

<ul>
<li><a href="http://www.cplusplus.com/doc/tutorial/basic_io/" rel="nofollow noreferrer">http://www.cplusplus.com/doc/tutorial/basic_io/</a></li>
</ul>

<p>Yes, it's confusing using the same symbols for more than one thing...</p>

<blockquote>
  <p>Moreover, F seems to never be defined prior to this.</p>
</blockquote>

<p><code>F()</code> is a macro. It's defined by the Arduino core in WString.h:</p>

<pre><code>#define F(string_literal) (reinterpret_cast&lt;const __FlashStringHelper *&gt;(PSTR(string_literal)))
</code></pre>
