我尝试制作一个程序,告诉您文本文件中有多少单词,行和字符,但函数fopen()
无法打开文件。我尝试了文本文件的绝对和相对路径,但我得到了相同的输出。你能告诉我什么是错的吗?
我的编译器是gcc版本4.6.3(Linux)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 256
void tokenize(const char *filename)
{
FILE *f=NULL;
char line[N],*p;
unsigned long int ch=0,wd=0,ln=0;
int t;
f=fopen(filename,"rt");
if(f==NULL)
{
perror("The following error occurred");
exit(1);
}
fgets(line,N,f);
while(!feof(f))
{
ln++;
p=strtok(line," ");
while(p!=NULL)
{
wd++;
t=strlen(p);
ch+=t;
printf("Word number %lu with length %d: %s\n",wd,t,p);
p=strtok(NULL," ");
}
fgets(line,N,f);
}
printf("%lu lines, %lu words, %lu characters\n",ln,wd,ch);
fclose(f);
}
int main(void)
{
char filename[80];
size_t slen;
printf("Enter filename path:\n");
fgets(filename,80,stdin);
slen = strlen (filename);
if ((slen > 0) && (filename[slen-1] == '\n'))
filename[slen-1] = '\0';
printf("You have entered the following path: %s\n",filename);
tokenize(filename);
return 0;
}
输出:
Enter filename path:
input.txt
You have entered the following path: input.txt
The following error occurred: No such file or directory
答案 0 :(得分:4)
您已从文件名中的输入中保留换行符。当您在输出中回显文件名时,可以看到这一点:注意空白行。
在将新换行符传递给函数之前,您需要将其删除。有几种方法可以做到这一点,这里有一个:
size_t idx = strlen(filename);
if ((idx > 0) && filename[idx - 1] == '\n')
filename[idx - 1] = '\0';
答案 1 :(得分:2)
您需要从字符串中删除尾随换行符,例如:
size_t slen = strlen (filename);
if ((slen > 0) && (filename[slen-1] == '\n'))
filename[slen-1] = '\0';
而且,虽然我赞赏你使用fgets
进行用户输入(因为它可以防止缓冲区溢出),但仍然有一些你没有考虑过的边缘情况,例如线路太多long,或用户标志输入结束)。请参阅here以获得更强大的解决方案。
答案 2 :(得分:1)
您可以声明如下函数:
void rmnewline(char *s)
{
int l=strlen(s);
if(l>0 && s[l-1]=='\n')
s[l-1]='\0';
}
并在使用char数组之前调用它。