从文本文件中逐个计算字符

时间:2015-11-03 21:06:37

标签: c file fgets

我的程序需要从文本文件中获取输入并将其输出到单行。

但是,如果单数行上的字符数超过60,则应该有一个新行。

到目前为止我的代码:

 int main(int argc, char *argv[]){
 FILE *pFile;
 char x[10];
 char *token;
 pFile = fopen("test5.txt","r");
 int wordLength;
 int totalCharLength;
 char newline[10] = "newline";


 if(pFile != NULL){
        while (fgets(x, sizeof(x), pFile) != NULL) {
         token = strtok(x,"\r\n");
         if(token != NULL){
                printf("%s",x);

            }

         else{
                printf("%s",x);
        }
        //counter++;
        wordLength = strlen(x);
        totalCharLength += wordLength;
        printf("%d",totalCharLength);
        if(totalCharLength == 60){
            printf("%s",newline);
        }

    }

        fclose(pFile);
}
}

TEXTFILE:

 a dog chased 

 a cat up the 

 tree. The cat 

 looked at the dog from 

 the top of the tree.  

有5个单独的行。哪个显示了这个。这不是全部。

输出:

 a dog chased a cat up the tree. The cat looked at the dog from the top of the tree.

现在程序需要能够以该格式获取输入文本并打印出来。

所以上面的输出应该在第60个字符处有一个新行,它在第二个单词“dog”之前。

但是我想添加一个功能,以便有一个字符计数器,当字符数= 60时,它会打印一个新行。

现在通过更多调试我添加了代码

 printf("%d",totalCharLength);

就在if(totalCharLength == 60)行之前,我意识到字符是以随机增量而不是逐个计算的。输出:

 a dog cha9sed 13a cat up 22the 26tree. The35 cat 40looked at49 the dog 58 from 63 the top o72f the tre81e.  85

因此,这表明它不会逐个字符计算。但是,当我将charx [10]更改为较低的值时,它不会在一行上打印所有内容。它会留下空白。

示例:将charx [10]更改为charx [2]

这正确地按字符获取字符,但输出不在一行上。

当一行中字符超过60时,唯一应该有新行的时间。不是14(第一行)。

 a2 3d4o5g6 7c8h9a10s11e12d13 14
 30a17 18c19a20t21 22u23p24 25t26h27e28 29
 46t32r33e34e35.36 37T38h39e40 41c42a43t44 45
 71l48o49o50k51e52d53 54a55t56 57t58h59e60newline 61d62o63g64 65f66r67o68m69   70
 72t73h74e75 76t77o78p79 80o81f82 83t84h85e86 87t88r89e90e91.92 93 94

6 个答案:

答案 0 :(得分:1)

我认为你最好自己打印每个字符,并在添加换行符之前检查空格。

类似的东西:

((charCount > 60) && (currentChar == ' ')) {
    // print newline and reset counter
    printf("\n");
    charCount = 0;
}

编辑: 在任何事情之前检查当前的char是否已经是换行符并跳过它。 检查回车\r,因为在窗口换行符是\r\n

#include <stdio.h>

int main(void) {
  FILE *f = fopen("test.txt", "r");
  if(!f) {
    printf("File not found.\n");
    return 1;
  }

  char c;
  int cCount = 0;
  while((c = fgetc(f)) != EOF) {
    if(c == '\r') continue;
    if(c == '\n') c = ' ';

    printf("%c", c);
    if((cCount++ > 60) && (c == ' ')) {
      printf("\n");
      cCount = 0;
    }
  }

  fclose(f);
  return 0;
}

答案 1 :(得分:1)

你去了

<html lang="en">
<head>
    <!-- The Homebrewery - About
    Author: Chris Stastny
    Date: October 15th, 2015
-->

  <meta charset="utf-8">
  <title>The Homebrewery - About Homebrewing</title>
  <meta name="description" content="About Homebrewing">
  <meta name="author" content="Chris Stastny">
  <link href="final.css" rel="stylesheet" type="text/css" />

  <script src="modernizr-1.5.js"></script>
  <script src="function.js"></script>

</head>


<body>
<header>    
<h1>The Homebrewery</h1>
    <div id="dateBox">
        Today is <br />
        <script type="text/javascript">
           document.write(showDate());
        </script>
        <br />      
        Beer style today <br />
        <script type="text/javascript">
           document.write(showBeerStyle(dayNumber()));
        </script>   
     </div>   

</header>

答案 2 :(得分:0)

if(token != NULL){
            printf("%s",x);
           strcat(newArray, x);
        }

打印出令牌后,还有一个单独的数组,您也可以连接该令牌。这将在一行中为您提供整个文件。从这里解析60个字符然后打印线就会容易得多。

答案 3 :(得分:0)

就是这样,

#include<stdio.h>
//#pragma warning(disable : 4996)


int main()
{
    FILE *pfile;
    char data;
    int count = 1;
    pfile = fopen("test.txt", "r");
    printf("Opening file...\n");
    if (pfile == NULL)
    {
        printf("Error!\n");
    }

    while ((data = fgetc(pfile)) != EOF)
    {
       if (count != 60)
       {
          if (data != '\n')
          {
            printf("%c", data);
            count++;
          }

       }
       else
       {
          printf("\n");
          count = 1;
       }

    }
    fclose(pfile);
  return 0;
}

答案 4 :(得分:0)

在第一种情况下,当您有char x[10]时,fgets最多可读取9个字符,或直到找到换行符。所以输出是

a dog cha9sed 13a cat up 22the 26

因为第一次调用fgets读取9个字符(然后打印9),第二次调用读取到换行符(打印13),第三次调用读取9个字符(打印22),第四次调用呼叫读取到换行符(打印26)。

当您更改为char x[2]时,fgets一次只会读取一个字符。这导致strtok的工作方式与您预期的不同。当字符串仅包含分隔符时,strtok将返回NULL并且字符串未经修改。因此,如果字符串仅包含换行符,则strtok不会像您期望的那样删除换行符。

要修复代码,请使用fgetc阅读字符,不要使用strtok

int main( void )
{
    FILE *pFile;
    if ( (pFile = fopen("test5.txt","r")) == NULL )
        exit( 1 );

    int c, count;

    count = 0;
    while ( (c = fgetc(pFile)) != EOF ) {
        if ( c == '\n' )
            putchar( ' ' );
        else
            putchar( c );

        count++;
        if ( count == 60 ) {
            putchar( '\n' );
            count = 0;
        }
    }
    putchar( '\n' );
    fclose(pFile);
}

这是我用

测试的文件
a dog chased
a cat up the
tree. The cat
looked at the dog from
the top of the tree.

答案 5 :(得分:0)

sudo python3 -m pip install requests