2017-07-25 6 views
2

私はcコードを持っています、単にtxtファイルから行を読み込みます。ファイルは以下の通りであるだけで1行があります。C - fgetsがCR文字をスキップ

Content of txt file

をこの行を読むためのコードスニペットは、次のとおりです。

int** readFile(char* filename){ 

    int col=0, row =0; 
    int i=0; 
    int* numList[2048]; 

    for(int i = 0; i<2048; i++) 
     numList[i] = (int*) malloc(6*sizeof(int)); 

    if(NULL == numList){ 

     printf("Memory error!"); 

    } 

    char * token = NULL; 

    char currentLine[25] = {'\0'}; 

    FILE* file = fopen(filename, "r"); 

    if(NULL != file){ 

     printf("File is opened successfully\n"); 

     if(NULL != fgets (currentLine, 60, file)) 
     { 
      int i = 0; 
      while (NULL != currentLine[i]){ 

       printf("%d ", currentLine[i]); 
       i++; 
      } 
     } 
    } 
    else 
    { 
     printf("File I/O Error"); 
     return NULL; 
    } 

    fclose(file); 

    return numList; 
} 

このコードが実行されると、私は次の出力を得る:

Output of program

私は疑わしいものを観察しました。これは、最初のスクリーンショット(Content of txt file)で見られるように、Notepa d ++は行末にCR LFを表示します。しかし、出力では、私はLFである最後の文字として10を参照してください。

おそらく私は非常に原始的な点を見逃していますが、私はなぜCRキャラクターが存在しないのか理解できませんでした。

言うまでもなく、プラットフォームはウィンドウであり、これはコンソールプログラムです。

ありがとうございました&よろしく。

+4

1)Windows環境では、相互変換(LF <-> CRLF)されますテキストモードの入出力で行われます。 – BLUEPIXY

+4

2) '60' <->' 25'はサイズに一致しません。 – BLUEPIXY

+2

'numList'は、自動ストレージクラスを持つ配列(つまり、スタック上のローカル変数)として宣言しています。関数の最後には' return numList; 'があります。スタック上の変数へのポインタが返され、_undefined behavior_になります。 –

答えて

8

テキストモードでファイルを開いています。このモードでは、どのプラットフォームでも同じテキストファイルを扱うことができます。

Cはの末尾にとして'\n'を指定します。 Windowsでは、行の末尾がで、シーケンスは"\r\n"です。 C(この場合、stdioを実装している標準ライブラリ)が自動的にこれを翻訳します。 Windowsのファイルをのテキストモードで読むと、\r\nの場合は\nとなります。

ファイルの正確バイトの内容を確認したい場合は、あなたの代わりにバイナリモードでそれを開く必要があり:

FILE* file = fopen(filename, "rb"); 
+0

ありがとうございました!これは私が探していた答えです。 –

+1

@UgurKAYA YW。あなたが受け取ったすべてのコメントをまだ見ていると、あなたが表示するコードスニペットにかなりの重大な問題があります。私はこれらの問題を無視してあなたの直ぐ質問に答えました。 –

+0

はい、あなたは正しいです。これはプロジェクトの正確なコードではなく、少し単純化されています。また、それはプロジェクトの正確なtxtファイルではありませんが、依然としていくつかの問題があり、私はそれらを描いた皆さんに感謝します。 –

関連する問題