0

私は自分でcを学んでおり、実際にファイル内のTAbの数を数えるプログラムをコーディングしようとしています.行にタブがある場合は、行全体とこの行のタブの数を出力したいと思います. そして、それがそれほど難しくない場合は、行が80文字を超える場合にもそれを行うのを手伝ってほしいです。この行と文字数を印刷して、この主な機能を持っています:

include <stdio.h> /* printf */

/* Prototype from tablen.c */
void tablen(const char *filename);

int main(int argc, char **argv)
{
  if (argc < 2)
  {
    printf("Usage: tablen filename\n");
    printf("where: filename - file to process.\n");
    return -1;
  }

  tablen(argv[1]);

  return 0;
}

このメイン関数は非常に基本的なものなので、エラーがないことを願っています。そして、この機能も:

include <stdio.h>  /* FILE, fopen, feof, fgets, fclose   */
include <string.h> /*  strlen */ 

void tablen(const char *filename)
{

    /*Variables*/   
    int i; /*loop controller */
    int tabs = 0; /*number of tabs*/
    int line = 0; /*current line*/
    int size_string; /*size of the string*/

    File *file; /* open and read the file */


    file = fopen(filename, "rt"); /*open the file for read text*/
    size_string = strlen(filename);

    /*if we can read the file*/
    if(file)
    {
        /*while we don't reach the end of file, we still reading*/
        while (!feof(file))
        {
            for(i = 0; i < size_string; i++)
            {
                if(filename[i] == 9) /*ASCII value of TAB is 9 or '\'*/
                {
                    tabs++;
                }           

                if(tabs > 0)
                {
                    printf("# %i: (tabs: %i) |", line, tabs);
                }
                if(filename[i] == '\n')
                {
                    line++;                 
                    tabs = 0;
                }


            }
        }
    }
}

私はこの疑似コードを書きましたが、それは正しいと思います タブをカウントする場合: まず、ファイル内にさらに行がある間に、読み取り/テキスト用にファイルを開きます (そして、1 つずつ読み取ります)。見つかった場合は、タブの数をカウントしますタブ付きの行、行とタブの数を出力しますもちろん、ファイルを閉じます

線の長さの確認用

最初に読み取り/テキスト用にファイルを開き、ファイルにさらに行があることを確認します。各行の長さを調べます。行が 80 文字を超える場合は、その行を長さ情報とともに出力します

ファイルを扱うのは初めてなので、正しい方法であるかどうかはわかりません

4

1 に答える 1

1

一度に1行のタブ数を数えるには、getline() 関数を使用することをお勧めします。getline() は、ファイル ストリームから行を読み取り、読み取った行の文字数を返します。詳細については、getline() のマニュアル ページを参照してください。

問題の解決策については、以下のコードをご覧ください。

#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;
    int tabs=0,totaltabs=0,i;
        fp = fopen(argv[1], "r");
        if (fp == NULL)
           exit(EXIT_FAILURE);
        while ((read = getline(&line, &len, fp)) != -1) {
              printf("Retrieved line of length %d\n", read);
        for(i=0;i<read;i++){
            if(line[i] == '\t')
            tabs++; 
        }
        if(tabs){
                    printf("line = %s\nNumber of tabs = %d\n",line,tabs);
            totaltabs = totaltabs+tabs;
            tabs=0;
           }
        if(read >=80)
            printf("%s\n",line);
    }       
           if (line)
               free(line);
           exit(EXIT_SUCCESS);

}
于 2012-12-18T09:12:57.053 に答える