打印从文本文件中读取的每个单词的第5个字母

时间:2015-06-04 13:03:05

标签: c file-io

我想从文本文件中读取每个单词的第5个字母。我不知道我错在哪里。

输入文件路径后,我会弹出一个窗口

  

read.c已停止工作。

代码:

#include<stdio.h>
#include<conio.h>
int main(void){
  char fname[30];
  char ch[]={'\0'};
  int i=0;
  FILE *fp;
  printf("enter file name with path\n");
  gets(fname);
  fp=fopen(fname,"r");
  if(fp==0)
       printf("file doesnot exist\n");
  else{
       printf("File read successfully\n");
       do{
         ch[i]=getc(fp);
         if(feof(fp)){
             printf("end of file");
             break;
         }
         else if(ch[i]=='\n'){
             putc(ch[4],stdout);
        }
        i++;
    }while(1);
    fclose(fp);
  }
  return 0;
}

3 个答案:

答案 0 :(得分:5)

  

我想找到每个单词的第5个字母

这不是你的代码现在正在做的事情。出于各种原因这是错误的,例如

  • char ch[]={'\0'};是一个长度为1且未绑定ch[i]的数组,您正在超出创建undefined behaviour的已分配内存。
  • gets()非常危险,可能导致缓冲区溢出。
  • getc()读取逐个字符,而不是逐字逐句,因此您还需要将空格字符(' ')作为分隔符。

我的建议是,使用以下算法重写代码。

  1. 分配一个足够长的缓冲区,以便从文件中保存完整的
  2. 打开文件,检查是否成功。
  3. 使用fgets()

    将整行读入缓冲区

    3.1。如果fgets()返回NULL,则很可能到达文件末尾。端。

    3.2。否则,继续下一步。

  4. 使用strtok()进行标记,并使用空格' '作为分隔符。检查返回的令牌是否为NULL。

    4.1。如果token为NULL,请转到步骤3。

    4.2。如果token不为NULL,则继续执行下一步。

  5. 检查返回令牌的strlen())。如果它超过4,则打印令牌的索引 4。 (请记住,c中的数组索引基于0

  6. 继续执行第4步。

答案 1 :(得分:2)

您可以使用以下代码段。使用此代码,您需要知道最大行长。如果长度为5或更长,此代码会在每个单词的每行上打印第5个字符。。希望这对你有用。

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

#define MAX_LINE 1000

int main()
{

    char fname[30];
    char myCurLine[MAX_LINE + 1];
    char myCurWord[MAX_LINE + 1];
    int index,loop; 
    FILE *fp;

    printf("enter file name with path\n");
    gets(fname);
    fp=fopen(fname,"r");
    if(fp==0)
       printf("file doesnot exist\n");
    else
    {
        printf("File read successfully\n");
        do
        {       
            if(fgets(myCurLine,MAX_LINE,fp) != NULL)
            {               
                index = 0;
                for(loop = 0;loop < MAX_LINE; loop++)
                {
                    myCurWord[index] = myCurLine[loop];
                    index++;

                    if((myCurLine[loop] == ' ') || (myCurLine[loop] == '\n'))
                    {
                        myCurWord[index] = '\0';                                            
                        index = 0;
                        if(strlen(myCurWord) > 4)
                        {
                            putchar(myCurWord[4]);
                        }
                        index = 0;

                        if(myCurLine[loop] == '\n')
                            break;
                    }                   
                }
            }

            if(feof(fp))
            {               
                break;
            }                           
        }while(1);
        fclose(fp);
    }
    return 0;
}

答案 2 :(得分:1)

由于以下原因,我修改了您的代码:

  • 您根本不需要使用warSourceDirectory数组,因为您只检查字母,并且可以计算文件中每个字的字母(可以是使用空格检查)并在计数达到char时打印(因为我们从4开始)。

  • 由于0没有溢出保护,因此gets()更受欢迎。

    fgets()

  • 另一点是,您可以将fgets(fname, sizeof(fname), stdin);循环简化为一个do-while循环,如果达到while,条件为中断,因为您的EOF只是一个无限循环(条件定义为do-whiletrue)在1处断开(在无限EOF内的单独if中检查)。< / p>

    do-while

  • while (!feof)数组的替代方法是循环,直到找到空格char或换行符' '

  • 我还从'\n'删除了else以避免太多缩进。

  • 我还添加了if (fp==0)来检查第5个字母是否真的是使用ctype.h的字母。
  

这就是“第5个字母搜索”的用法:

     
      
  1. 循环(外循环),直到文件结束(isalpha())。
  2.   
  3. 外循环的每次迭代中,循环( 内循环 ),直到空格EOF或换行{找到{1}}。

         
        
    • 如果 内循环 中的计数器达到' '(表示已达到第5个字母),   
          
      • 打印当前的信件,
      •   
      • 将计数器重置为零,
      •   
      • 然后打破 内循环
      •   
    •   
  4.   

将这些修改应用于您的代码,

'\n'

*注意:输出中不包含少于5个字母的单词,但您可以指定一个字符或数字来表示单词少于5个字母。 (例如4 #include<stdio.h> #include<conio.h> #include<ctype.h> int main(void){ char fname[30]; char ch; // changed from array to single char int i=0; FILE *fp; printf("enter file name with path\n"); fgets(fname, sizeof(fname), stdin); // changed from gets() // removes the \n from the input, or else the file won't be located // I never encountered a file with newlines in its name. strtok(fname, "\n"); fp=fopen(fname,"r"); // if file open failed, // it tells the user that file doesn't exits, // then ends the program if (!fp) { printf("file does not exist\n"); return -1; } // loops until end-of-file while (!feof(fp)) // loops until space or newline or when 5th letter is found for (i = 0; (ch=getc(fp)) != ' ' && ch != '\n'; i++) // if 5th character is reached and it is a letter if (i == 4 && isalpha(ch)) { putc(ch ,stdout); // resets letter counter, ends the loop i = 0; break; } fclose(fp); return 0; }

示例 0

-1

输出:

read.txt