2016-12-21 11 views
0

私はすべてのテキストを別々の.txtファイルに置くプログラム(コンソール)を持っています。C:fgetsを nファイルから改行する方法

は、私は、ファイルから文字列を読み取るためにfgets()を使用しますが、ファイルは、\ nを含んでいると私は後で文字列を印刷するとき、それは、nの代わりに改行ここ

の\を出力する例である:

FILE* fic = NULL; 
char str[22]; //str is the string we will use 

//open the file 
fic = fopen ("text.txt", "r"); 

//read from the file 
fgets(str, size, fic); 

printf(str); 

これは私が私のTEXT.TXTに持っているものである場合:

This is \n an example 

しかし何コンソール上に出てくることは

ですそれは\ nと書かれているファイルに :
This is \n an example 

代わりの

This is 
an example 

編集。また、ファイル内でaddint \や\ tを試しましたが、表や単一のバックスラッシュの代わりに\と\ tが出力されます

+1

ファイルに2文字( ''\'と' 'n')または1文字( ''\ n")がありますか? – mch

+0

がファイルに書き込まれました\ nファイルにaddint \\または\ tも試しましたが、表形式または単一のバックスラッシュの代わりに\\と\ tが出力されます – Speedphoenix

+0

''\ n'' ** is is ** linebreak /改行文字。私はまったく問題は見ません。 **決して**外部ソースからの文字列を 'printf'形式の文字列として使うことは決してありません!これはCの最も一般的なセキュリティホールの1つです。 – Olaf

答えて

3

fgetsは\とnを通常の文字として見ます。 自分自身で改行文字に変換する必要があります。たぶんstrstr()やそれに類するものの助けを借りて。

1

文字列と文字リテラルのエスケープ文字はコンパイラコードを解析します。すべての文字列のライブラリやランタイムコードに存在するものではありません。

たとえば、 2つの文字\nを読み込み、コード内で自分で処理する必要があります。たとえば、文字列を文字列に移動して'\\'とそれに続いて'n'を探します。

+0

@ LeonardoJeanteurだから、単一の文字\と1文字のnが続きますか?つまり、ランタイムライブラリや既存の標準の文字列関数は改行文字に変換しません。あなた自身でその翻訳をしなければなりません。 –

+0

あなたの答えが間違っています。私のコメントを削除しました。あなたの答えをありがとうございます – Speedphoenix

0

コンパイラは、テキストファイルをスキャンし、データ/テキストをそのままstr文字列に格納しています。コンパイラはエスケープシーケンスとして\nを使用しません。したがって、\nが表示されたときに次の行に移動する場合は、文字ごとにスキャンする必要があります。\nが表示された場合は、printf("\n")にする必要があります。

#include <stdio.h> 

int main(){ 
    char str[30]; 
    int i = 0; 
    FILE *fic = NULL; 
    fic = fopen("text.txt", "r"); 
    while(!feof(fic)){ 
     str[i++] = getc(fic); 
     if(i > 30){ //Exit the loop to avoid writing outside of the string 
      break; 
     } 
    } 
    str[i - 1] = '\0'; 
    fclose(fic); 

    for(i = 0; str[i] != '\0'; i++){ 
     if(str[i] == 'n' && str[i - 1] == '\\'){ 
      printf("\n"); 
      continue; 
     } 
     if(str[i] == '\\' && str[i + 1] == 'n'){ 
      printf("\n"); 
      continue; 
     } 
     printf("%c",str[i]); 
    } 
    return 0; 
} 
+0

ファイルの終わりに遭遇し、 'gets()'が 'EOF'を返すと、このコードは' str [i ++] 'に' EOF'を文字。良いプログラミングではありません。 fgetc()の結果を 'int ch = fgetc();のように確認してください。 if(ch == EOF)が壊れます。 str [i ++] = ch; '。あまりにも遅れて問題を発見したので、ここでは 'feof(fic)'は必要ありません。 – chux