我刚开始学习C 3天前,我正在尝试制作一个程序,它接收一个文件,读取字符,并从中删除所有空格和标签。我是一名初学程序员,在开始学习C之前只学过一点MATLAB。我使用的是Ubuntu 12.04。
这是我的代码:
#include <stdio.h>
int main ()
{
FILE * pFile;
FILE * pFile2;
int c;
pFile = fopen ("spaces.txt","r");
pFile2 = fopen ("nospaces.txt","w");
if (pFile==NULL) perror ("Error opening file");
else
{
while (c != EOF)
{
c = fgetc (pFile);
if (!(c == ' ' || c == ' '))
{
fputc (c, pFile2);
}
}
fclose (pFile2);
fclose (pFile);
}
return 0;
}
当我打开新文件“nospaces.txt”时,一切都很好,除非最后有奇怪的字符。 Gedit说它是/ FF或/ 00,背景为红色,并抱怨我不应该编辑该文件,因为我可能会破坏它。无论我怎样做,我都无法在最后摆脱那个奇怪的角色。以下是我尝试过的例子:
- 使用fputc(EOF,pFile2)将EOF,'\ 0'和其他随机字符添加到pFile2的末尾 - 对c的值进行随机约束,使其不选择不是字母或数字的字符(如40&lt; c&lt; 125) - 把它做成while而不是while循环(我不知道区别)
请帮忙。 谢谢。
答案 0 :(得分:1)
您的读取循环错误。你读了一个字符太多了。
while (c != EOF)
{
c = fgetc (pFile);
if (!(c == ' ' || c == \t)) {
fputc (c, pFile2);
}
}
说:“虽然c
不等于文件结束值,但是再读一个字符并写下来”那么,还有一个字符是EOF
。您需要在检查前提取字符:
while ((c = fgetc(pFile)) != EOF)
{
if (c != ' ' && c != \t) {
fputc (c, pFile2);
}
}
在旁注中,c
在您第一次阅读之前未初始化,这会调用未定义的行为,因为它的值是不确定的。新版本也修复了这个问题。
答案 1 :(得分:1)
你去:
int c;
// ...
while ( c != EOF )
这使用未初始化的c
值,该值没有明确定义的行为。
您最后获得虚假角色的原因是,当您在到达文件末尾后致电fgetc
时,c
设置为EOF
,但随后您继续使用fputc(c, pFile2)
致电EOF
。
解决这两个问题而不需要代码重复的常用方法是在测试条件中包含读取操作:
while ( (c = fgetc(pFile)) != EOF )
{
if ( c != ' ' )
fputc(c, pFile2);
}
此外,这一行有一个逻辑问题:
if (!(c == ' ' || c == ' ')) {
第一次测试c == ' '
足够清楚了。但我不知道你在测试的第二部分尝试做什么(而且我确定你不会实现它的任何目标!)。 ' '
中包含的内容代表单个字符。
我刚想到你可能意味着一个水平标签;如果是,那么写'\t'
。您可能会发现来自isspace
的函数<ctype.h>
非常有用,它会检查空格(尽管它也会将'\n'
计为空格,因此您需要为此做出异常)。
答案 2 :(得分:0)
实际上你的c
首先是未初始化的。所以首先阅读,然后检查条件,如下所示
while ((c = fgetc(pFile)) != EOF)
{
if (c != ' ' && c != \t)
{
fputc (c, pFile2);
}
}