2016-03-23 16 views
0

私はプログラミングの初心者です。これは私の最初の質問ですので、ルール!C言語でFN LN形式の文字列をLN、FN(John Doe、Doe、John)に変換する

コンピュータサイエンスIIコースの課題は、ファイルに自分の名前をつけたり、ファイルに自分の名前を書き込んだりすることです(John Doeと言うことがあります) )、そのファイルの内容を出力します。私はこの部分を達成することができました。

今、私の名前を姓、名字の形式に変換して別のファイルに書き込む関数を書いて使用するように指示されています。それは特に上記のファイルの内容を出力するように私に言いませんが、とにかくしたいです。

私は名前の変換にどのようにアプローチするのか正確にはわかりません。私は姓と名義で2つの異なる文字列を作成する必要があります(私はこれを行うことについて考えましたが、特に効果的ではありませんでした)。それはまた、構造体を利用する必要があるような状況のようには見えませんが、私はそれを完全に取り除くことができます。これまで私が持っていたことは次のとおりです。

#include <stdio.h> 
#define SIZE 20 


int main(void) 
{ 
    FILE *readPtr;//readfile.txt file pointer 
    FILE *writePtr;//writefile.txt file pointer 
    char nameFull[SIZE] = "John Doe"; 


    readPtr = fopen("readfile.txt", "w");//creates readfile.txt file for writing 
    fprintf(readPtr, "%s", nameFull);//writes contents of string "nameFull" to file 
    fclose(readPtr);//close file 

    if((readPtr = fopen("readfile.txt", "r")) == NULL){//returns error message if file can't be opened 
     printf("Error opening file!\n"); 
    } 
    else{ 
     while(!feof(readPtr)){//end of file check for readPtr file 

      fscanf(readPtr, "%[^\n]s", nameFull); 
      printf("\n%s\n\n", nameFull); 

     } 
     fclose(readPtr); 
    } 
} 

すべての回答や提案は大歓迎です。正しい方向へのちょっとした動きだけでもすばらしくなるでしょう。また、私の投稿についての提案/批判も歓迎されているので、今後も改善する可能性があります。御時間ありがとうございます!

+1

[!のFEOF(readPtr)が '間違っている一方で、なぜ'](http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) – Barmar

+0

はい、2つの文字列を使用します。 'fscanf'で'%s'を使用して、各文字列に1つの単語を読み込みます。次に、 'printf'を使って2番目のファイルにそれらを読み込むのとは異なる順序で書き込みます。 – Barmar

答えて

1

まず、「FN LN」を「LN、FN」に変換するコードを別の関数で作成する必要があります。この関数は、LN、FNフォームに2つ以上の文字(カンマとスペース)が含まれているため、メモリを割り当てる必要があります。

char *revname(const char *fnln) 
{ 
    char *buf; 

    /* +2 for space and comma, +1 for null terminator */ 
    if ((buf = malloc(strlen(fnln) + 3)) != NULL) { 
     char *p, *q; 
     size_t len; 

     /* find the first space in the string */ 
     if ((p = strchr(fnln, ' ')) != NULL) { 
      /* copy the text after the space */ 
      strcpy(buf, p + 1); 
      strcat(buf, ", "); 

      len = strlen(buf); 

      /* append the first name */ 
      for (q = (char *) fnln; q < p; ++q) 
       buf[len++] = *q; 
     } 
     /* null terminate the string */ 
     buf[len] = '\0'; 
    } 
    return buf; 
} 

ここでは、メインコードです。 while (!feof())は、の読み取り後にEOFインジケータがに設定されているため、間違っています。したがって、ループは意図した以上に1回実行されます。完成したコードは

void remlast(char *str) { str[strlen(str) - 1] = '\0'; } 
int main() 
{ 
    FILE *fp; 
    char name[20], *newname; 

    if ((fp = fopen("filename", "w")) != NULL) { 
     /* write the name onto the file */ 
     fputs("John Doe", fp); 

     /* reuse the same file pointer for reading */ 
     if ((fp = freopen("filename", "r", fp)) != NULL) { 
      fgets(name, 20, fp); 

      /* remove the trailing newline from fgets */ 
      remlast(name); 

      newname = revname(name); 
      printf("%s\n", newname); 

      /* free memory allocated by revname */ 
      free(newname); 
      fclose(fp); 
     } else { 
      perror("freopen"); 
      return 1; 
     } 
    } else { 
     perror("fopen"); 
     return 1; 
    } 
    return 0; 
} 

。注:私はmainをテストしていないので、存在する場合、バグは私に知らせてください。

+0

'fscanf(fp、"%s "、name);'が間違っています。 – BLUEPIXY

+0

どうしたの? @BLUEPIXYオーバーフローを避けるために幅指定子を追加すべきですか? – stackptr

+0

'scanf'ファミリの'%s'にはスペースは含まれていません。したがって、期待どおりに動作しません。 (_オーバーフローを避けるために幅指定子を追加する必要がありますか?_はい:) – BLUEPIXY

0

これは1つの方法です。

  1. 名は[] FNLNnamefile.txt
  2. に書き込まれた名前は、[]
  3. FNLNnameFile.txtバック名に[]
  4. 名[] LNFNnamefile.txt 名に書き出さ[]での読み取りをクリア様々な点で印刷されます。

はいそれはマイナー一度別の機能によって操作することにより、それをスワップ又は辞書やワード長順序または何をできる名前[]順に読み込まれても、単純な要素の逆と末尾の「チート」名前[]を渡します。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define  EXIT_FAIL  0x01 
#define  MAX_WORD_LEN 0x1F 
#define  MAX_WORDS  0x02 

int main(void) 
{ 
    FILE   *fptr_MyFile; 
    unsigned char *ucName[MAX_WORDS]; 
    unsigned char ucWord[MAX_WORD_LEN]; 
    unsigned int uiW0; 

    ucName[0x00] = "John"; 
    ucName[0x01] = "Doe"; 

    printf("Name array %s %s\n\n", ucName[0x00], ucName[0x01]); 

    fptr_MyFile = fopen("FNLNnamefile.txt", "w"); 
    if (fptr_MyFile == NULL) 
     { 
     printf("Could not create file. Ending.\n"); 
     return(EXIT_FAIL); 
     } 
    fprintf(fptr_MyFile, "%s %s", ucName[0x00], ucName[0x01]); 
    fclose(fptr_MyFile); 

    if ((fptr_MyFile = fopen("FNLNnamefile.txt", "r")) == NULL) 
     { 
     printf("Could not create file. Ending.\n"); 
     return(EXIT_FAIL); 
     } 

    ucName[0x00] = NULL; 
    ucName[0x01] = NULL; 

    printf("Name array %s %s\n\n", ucName[0x00], ucName[0x01]); 

    for (uiW0 = 0x00; ((uiW0 < MAX_WORDS) && (!feof(fptr_MyFile))); uiW0 = uiW0 + 0x01) 
     { 
     fscanf(fptr_MyFile, "%s", ucWord); 
     ucName[uiW0] = calloc(strlen(ucWord) + 1, sizeof(char)); 
     strcpy(ucName[uiW0], ucWord); 
     } 
    fclose(fptr_MyFile); 

    printf("Name array %s %s\n\n", ucName[0x00], ucName[0x01]); 

    fptr_MyFile = fopen("LNFNnamefile.txt", "w"); 
    if (fptr_MyFile == NULL) 
     { 
     printf("Could not create file. Ending.\n"); 
     return(EXIT_FAIL); 
     } 
    fprintf(fptr_MyFile, "%s, %s", ucName[0x01], ucName[0x00]); 
    fclose(fptr_MyFile); 

    printf("Final result %s, %s\n", ucName[0x01], ucName[0x00]); 

    return(EXIT_SUCCESS); 
} 
関連する問題