2017-12-18 17 views
0

行列(二次元的に配置された二次元配列)がファイルに保存されていることを前提とした、クイックプログラムの作成に問題があります。結果の出力ファイルをチェックすると、ファイルの各行の終わりに次のような太字と赤の "\ 00"のシンボルが表示されます。 これは私のコードです:Cのファイル(.txt形式)に行列を保存する

/*\param n number of rows 
    \param m number of columns 
    \param mat pointer to the matrix 
    \param f file already opened in write mode where to write the matrix 
    */ 
int save_to_file (char** mat, unsigned n, unsigned m, FILE* f){ 

    int i, j; 

    for(i = 0;i <= n; i++) 
     for(j = 0; j <= m; j++) 
      if(j == m) 
       fprintf(f, "%c\n", mat[i][j]); 
      else 
       fprintf(f, "%c", mat[i][j]); 
    if (f == NULL) 
     return -1; 
    else 
     return 0; 
} 

は、私は、ファイルに書いているように横たわっている問題ですか?それが事実なら、誰でも私がそれを修正するのを助けることができますか?

+4

を使用して変更することができますか? 'i <= n'はサイズが' m x n'なら不審なものです。また、すべてが終わった後、なぜ 'NULL'のために' f'をchackingしていますか? –

+0

間違いがあった場合、関数は-1を返す必要があります。なぜそれは疑わしいのですか? – Chiara

+3

'for'ループは' n + 1'回(0〜 'n')回を実行します。私はあなたの行列の次元を 'n x m'と仮定し、0を' n-1'に、0を 'm-1'にループさせたいと思いますか?言い換えれば、 'i lurker

答えて

0

コードの最初の問題は、forループの範囲です。 n行の場合は、ループは0からn-1(どちらも含まれています)に移動する必要があります。したがって、これらの行は:

for(i = 0;i <= n; i++) 
    for(j = 0; j <= m; j++) 
     if(j == m) 

for(i = 0;i < n; i++)   // Remove = 
    for(j = 0; j < m; j++)  // Remove = 
     if(j == m-1)   // Insert -1 

第二の問題は、あなたがfを使用している後NULLことfを確認することであるしなければなりません。これは悪い考えで、fNULLの場合、プログラムがクラッシュする可能性があります。代わりに、関数の最初のものとしてチェックを行います。

int save_to_file (char** mat, unsigned n, unsigned m, FILE* f){ 
    if (f == NULL) return -1; 
    .... 
    .... 
    return 0; 
} 

3番目の問題は、マトリックスにアクセスする方法です。行列が2D配列の場合(コードを投稿せずにテキストを書き込む場合)、char**として正しくアクセスすることはできません。 char**は、文字の配列を指すcharポインタの配列を持つときに使用できます。しかし、2D配列ではありません。

以下は、2D配列に基づく行列の検索方法の例です。

#include <stdio.h> 

int save_to_file (unsigned n, unsigned m, char mat[n][m]){ 

    int i, j; 

    for(i = 0; i < n; i++) 
     for(j = 0; j < m; j++) 
      if(j == m-1) 
       printf("%c\n", mat[i][j]); 
      else 
       printf("%c", mat[i][j]); 
} 

int main(void) { 

    char a[2][3] = {{'a','b','c'},{'d','e','f'}}; 
    save_to_file(2,3,a); 
    return 0; 
} 

出力:

abc 
def 

注意:上記の関数のプリントではなく、ファイルのstdoutにそれが簡単にあなたがそれを割り当てるにはどうすればよいfprintf

関連する問題