2017-08-20 3 views
0

私の質問についてはいくつかの質問がありますが、私はこれらの関連する質問から正確な答えを見つけることができません。それが私が求めている理由です。私が正しい答えを得るための機能を理解し、提供してください。私はテキストファイルを持っています。テキストファイルには文字列が含まれています。私はCのプログラミングを使用して文の終わりからスペースを削除したい

私はテキストファイルを持っています。 「filename.txt」と答えてください。 ファイルにはいくつかの文字列が含まれています。そして、すべての文の終わりに余分なスペースがあります。例については

:入力ファイル:ここで

high blood sugar levels (space) 
type 2 diabetes definition (space) 
high blood sugar symptoms 
glucose tolerance test 
symptoms of high blood sugar 

余分なスペースがあるすべての文の後に。私はそれらのスペースを削除したいと思います。

私はこのような出力ファイルを生成したい:(、)私はこれを試してみたが、スペースがカンマの前にまだある

high blood sugar levels, 
type 2 diabetes definition, 
high blood sugar symptoms, 
glucose tolerance test, 
symptoms of high blood sugar 

を。

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

int main() 
{ 
    fopen("out.txt", "w", "stdout"); 
    char ch, keywords[25]; 
    FILE *fp; 

    fp = fopen("keywords.txt","r"); // read mode 

    if(fp == NULL) 
    { 
     perror("Error while opening the file.\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("The contents of %s file are :\n", "keywords.txt"); 

    while((ch = fgetc(fp)) != EOF) 
    { 
     if(ch=='\n') ch=','; 
     printf("%c",ch); 
    } 

    fclose(fp); 
    return 0; 
} 

また、結果を出力ファイルに出力する方法も教えてください。私は私の個人的な仕事のためにこの単純なプログラムを使用します。だからこそ私は結果を見つけようとしている。私を助けてください。

+0

。 fopen( "out.txt"、 "w"、 "stdout"); '(型としてfreopen?)' 'FILE * fpw = fopen(" out.txt "、" w ");' then 'fprintf (fpw、...); ' – BLUEPIXY

+0

[end_trim](https://stackoverflow.com/a/30495937/971127)を参照してください – BLUEPIXY

+0

サンプルの入力と出力は混乱しています。文の終わりをマークするために通常使用される入力に句読点がないので、「文の終わり」と呼ばれます。改行をカンマで置き換えたいと思われるが、出力には改行とコンマが表示される。 –

答えて

1

末尾の空白(改行文字 '\ n'の前後にある文の後に出現するもの)に対しては何もしません。あなたがしているのは間違って試してみます(ファイルに書き込まないprintfしか使っていないので、とにかくあなたのtxtファイルに変更はありません)。'\n'をカンマで置き換えようとしています。すべてのスペースを持つ唯一の1行そのまま:

high blood sugar levels (space),type 2 diabetes definition (space),high blood sugar symptoms,glucose tolerance test,symptoms of high blood sugar, 

末尾のスペースを取り除くために、あなたの代わりに改行の単語を取得する場合は、スペースの数にあなたがそれらを見るたびにカウントし、カウントをリセットするようになりました。それ以外の場合は、空白を数えながら改行を取得した場合は、そのカウント値を使用してその多くのバックスペース'\b'を印刷し、その後にカンマを印刷します。カンマを付けた場所以外の空白を削除していないので、各行の改行は空白の後ろの同じ場所にあります。トリッキーな部分は、文の最後の文字の直後の'\n'という末尾のスペースがないコーナーケースです。最後の文字と改行の間にカンマを挿入すると、このカンマのスペースを作るためにファイル内のデータを移動する必要があります。したがって、最善の方法は、テンポラリファイルを使用し、末尾のスペースを削除してカンマを追加した後に、入力ファイルから行ごとにビルドすることです。あなたはここにfgetsfputs

+0

他のアイデアはこちら[link](https://stackoverflow.com/questions/1151713/delete-a-line-from-a-file-in-c-language) –

1

を使用する場合があります、私はあなたが

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

int main() 
{ 
    FILE *fp; 
    char ch; 
    int length, index; 
    char *tgt = NULL; 

    // open sourse file 
    fp = fopen("keywords.txt","r"); 

    if(fp == NULL) 
    { 
     perror("Error while opening the file.\n"); 
     exit(EXIT_FAILURE); 
    } 

    // determine length of the source file 
    fseek(fp, 0L, SEEK_END); 
    length = ftell(fp); 
    fseek(fp, 0L, SEEK_SET); 

    // allocate memory buffer 
    tgt = malloc(length); 

    if(tgt == NULL) 
    { 
     perror("Error while allocating memory.\n"); 
     exit(EXIT_FAILURE); 
    } 

    // initialize memory buffer 
    memset(tgt, 0, length); 

    // read file to memory buffer 
    fread(tgt, 1, length, fp); 

    // close sourse file 
    fclose(fp); 

    // handle contents of the source file 
    printf("The contents of %s file are :\n", "keywords.txt"); 

    index = 0; 
    while(index < length && tgt[index] != '\0') 
    { 
     if(tgt[index] == ' ' && index + 1 < length 
           && tgt[index + 1] == '\n') 
     { 
      printf(",\n");   
      index += 2; 
     } 
     else 
     { 
      printf("%c", tgt[index]); 
      index += 1; 
     } 
    } 

    // release memory 
    free(tgt); 

    getchar(); 

    return 0; 
} 

基本的な考え方を行うことができます示唆するものであることは非常に簡単です - あなたはメモリバッファに、ソースファイルを読み込み、そのあとは何をするのは自由ですこれまでにあなたはそれで欲しいです。

0

文字ではなく行単位でファイルを読み込むことができます。 それから、スペースを改行条件に続けて調べ、スペースをaで置き換えます(あなたの例ではまだ改行が必要です)。

私はこのようにそれを行うだろう:あなたはちょうど改行を交換する

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

int main(void){ 

    FILE *in ,*out; 
    ssize_t linelength; 
    size_t alloc_size; 
    char *line = NULL; 

    if (NULL == (in = fopen("keywords.txt", "r"))){ 
      perror("failed to open input file\n"); 
      return 1; 
    } 
    if (NULL == (out = fopen("out.txt", "w"))){ 
      perror("failed to open outputfile\n"); 
      return 1; 
    } 
    while (-1 != (linelength= getline(&line, &alloc_size, in))){ 
      /* line contains the whole line ('\0 terminated), including final '\n' 
      the length(as a string) is linelength */ 
      if (linelength < 2) continue; /* too short line */ 
      if (line[linelength -1] == '\n' && line[linelength-2] == ' '){ 
        line[linelength-2] = ','; 
      } 
      fprintf(out, "%s",line); 
    } 
    fclose(in); 
    fclose(out); 
    free(line); 
    return 0; 
} 
+0

Henno Brandsma様、 ありがとうございます回答。しかし、残念ながら私のIDE(Codeblock)はあなたのコードを実行している間にエラーを表示しています。私はgetl​​ine()関数を使用しませんでした。 エラーは未定義ですgetline()のようなヘッダファイルを宣言する必要がありますか? getline()関数を使うためには、どのヘッダファイルをインクルードするべきですか?これは入力操作なので、getline()関数はヘッダファイルを使用していると思います。私は正しい?しかし、なぜエラーは??? –

+0

#define _GNU_SOURCEを実行するのはstdio.hです。 Linuxシステムでman getlineを実行する@ShahiduzzamanShahid –

関連する問題