web-dev-qa-db-ja.com

行C / C ++の終わりまで文字で文字列を読み取る

一度に1文字ずつ文字列を読み取り、行末に達したら停止する方法は?私はfgetc関数を使用してファイルから読み取り、charsを配列に入れています(後者は配列をmallocに変更します)が、行末に到達したときに停止する方法がわかりません

これを試してみました(cはファイルからのcharを持つ変数です):

if(c=="\0")

しかし、ポインタを整数と比較できないというエラーが発生します

ファイルは次のようになります(単語の長さは不明です):

one
two
three

質問は次のとおりです。1)\ 0は2つの記号(\および0)であるか、1つとしてカウントされる(\ nと同じ質問)2)\ nを使用する必要があるので、cを\ 0と比較できますか? 3)上記の提案が間違っている場合、何を提案しますか(私は文字列を一度に1文字読む必要があります)

(私はC++にかなり新しいことに注意してください(およびそれ自体をプログラミング))

9
user3102621

単一引用符を使用します。

if(c=='\0')

二重引用符( ")は文字列用で、文字列です。一重引用符( ')は個々の文字用です。

ただし、行末は改行文字「\ n」で表されます。

どちらの場合も、バックスラッシュは文字の一部ではなく、特殊文字を表す方法にすぎないことに注意してください。バックスラッシュを使用すると、さまざまな印刷できない文字や、コンパイラを混乱させる可能性のある文字を表すことができます。

21
Vaughn Cato

元の質問に対する答え

文字列を一度に1文字ずつ読み取り、行末に達したら停止する方法は?

c ++では、非常に単純に、つまり:use getline です。リンクは簡単な例を示しています:

#include <iostream>
#include <string>
int main () {
  std::string name;
  std::cout << "Please, enter your full name: ";
  std::getline (std::cin,name);
  std::cout << "Hello, " << name << "!\n";
  return 0;
}

あなたは本当にCでこれをしたいですか?しません!問題は、Cでは、読む文字を配置するメモリを割り当てる必要があるということです。何人のキャラクター?あなたは事前に知りません。割り当てる文字数が少なすぎる場合は、毎回新しいバッファを割り当てて、スペースを確保するよりも多くの文字を読み取るようにしなければなりません。過剰に割り当てると、スペースを無駄にします。

Cは低レベルのプログラミング用の言語です。ファイルを1行ずつ読み取るための簡単なアプリケーションのプログラミングと作成に慣れていない場合は、C++を使用してください。すべてのメモリ割り当てを行います。

"\0"および行末に関する一般的な後の質問には他の人が回答し、CおよびC++に適用されます。ただし、Cを使用している場合は、行末だけでなく、メモリの割り当ても重要であることを忘れないでください。そして、バッファをオーバーランさせないように注意する必要があります。

4
Ray Toal

C関数fgetcを使用している場合、次の文字が改行文字またはEOFに等しいかどうかを確認する必要があります。例えば

unsigned int count = 0;
while ( 1 )
{
   int c = fgetc( FileStream );

   if ( c == EOF || c == '\n' )
   {
      printF( "The length of the line is %u\n", count );
      count = 0;
      if ( c == EOF ) break;
   }
   else
   {
      ++count;
   }
}    

または、do-whileループを使用してコードを書き直す方が良いでしょう。例えば

unsigned int count = 0;
do
{
   int c = fgetc( FileStream );

   if ( c == EOF || c == '\n' )
   {
      printF( "The length of the line is %u\n", count );
      count = 0;
   }
   else
   {
      ++count;
   }
} while ( c != EOF );

もちろん、読み取りxgaractersの独自の処理を挿入する必要があります。これは、関数fgetcを使用してファイルの行を読み取る方法の例にすぎません。

ただし、プログラムがC++で作成されている場合は、std::ifstreamおよびstd::stringクラスと関数std::getline行全体を読み取ります。

2

テキストファイルの行末に\ 0はありません。\nがあります。\nは文字列ではなく文字なので、一重引用符で囲む必要があります

if(c == '\ n')

0
ScottMcP-MVP