2015-05-24 53 views
-2

我试图测试是否在file.txt的字符是一个空格“”或不使用此代码:测试从文件

char *Appartient (FILE *f, char *S) 
{ 
    int i = 0, nbdechar = 0, nbocc = 0, PosdePremierChar, space = 0; 
    char c; 
    while ((c = getc(f)) != EOF) { 
     PosdePremierChar = ftell(f); 
     if (c == S[0]) { 
      nbdechar = 0; 
      for (i = 1; i < strlen(S); i++) { 
       c = getc(f); 
       if (c == S[i]) { 
        nbdechar++; 
       } 
      } 
      if (nbdechar == strlen(S) - 1) { 
       nbocc++; 
      } else { 
       rewind(f); 
       fseek(f, PosdePremierChar - 1, SEEK_CUR); 
       while ((c = getc(f)) != ' '); 
      } 
     } else { 
      while ((c = getc(f)) != ' ') { 
       space++; 
      } 
     } 
    } 
    printf("\n Le nb d'occurence est %d", nbocc); 
    if (nbocc == 0) { 
     return "false"; 
    } else { 
     return "true"; 
    } 
} 

但一个奇怪的符号“在一个字符串的空间ے”看起来像一个垃圾当我检查我的调试器变量“C”:

screenshot of debugger showing that variable 'c' has the value -1, which is interpreted as the character 'ے'

什么是错的

+1

绝对清楚你的要求!什么是调试模式?角色是如何出现的?我怀疑它,你没有发布打印字符的coed,发布的代码根本没有用处,不可能知道'f'是否被打开,唯一非常明显的是发布代码,它有丑陋的格式。 –

+0

调试模式让我看到c的价值每一次工作,它的工作步骤购买步骤,问题是为什么我字符空间它不认为像一个字符空间:) – Programmer

+0

“怪异的符号”是[U + 06D2 ARABIC LETTER YEH BARREE](http://www.fileformat.info/info/unicode/char/06d2/index.htm)。该字符可能在您的文件中,但通常情况下,getc不能将变量设置为0x06D2。我们需要查看你的*完整程序*,并且我们还需要通过更改代码来了解您正在使用的操作系统,编译器和IDE(如果有的话),以及*完全*这种“调试模式”的工作方式?在调试器中单步执行? (哪个调试器?)最后,看到引发这个问题的文件会很有帮助。 – zwol

回答

1

修改这样的代码,跟踪它,你可能就什么getc()回报之间的关系变得开明如何关联到char S:

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


int main(void) 
{ 
    int result = EXIT_SUCCESS; 

    FILE * f = fopen("test.txt", "r"); 
    if (NULL == f) 
    { 
    perror("fopen() failed"); 
    result = EXIT_FAILURE; 
    } 
    else 
    { 
    int result = EOF; 

    while (EOF != (result = getc(f))) 
    { 
     char c = result; 

     printf("\n%d is 0x%02x is '%c'", result, result, c); 
     if (' ' == c) 
     { 
     printf(" is space "); 
     } 
    } 

    printf("\nread EOF = %d = 0x%x\n", result, result); 

    fclose(f); 
    } 

    return result; 
} 
3

可能是从转换档案结尾结果的结果,EOF(标准化为负数,通常为-1)。

请注意,如果文件中没有空格,则自从EOF != ' '开始,循环不会终止,并且在第一次点击文件结束后该条件保持为真。如果f打开

+0

有空格int文件我不试图测试EOF我试图测试空格字符,告诉我一个新的字会出现 – Programmer

+1

@Programmer但你必须测试'EOF',因为如果你不那么循环将永远不会结束。 –

+0

@programmer然后,你应该向我们展示你的实际程序,而不是你编造的东西。没有任何声明在任何地方打印'c ='x''。而且你应该测试'fopen()'的返回值,因为它很容易失败。 – Jens

0

你没有测试,如果它没有那么未定义行为会发生,检查文件是否打开

FILE *file; 
int chr; 

if ((file = fopen("test.txt", "r")) == NULL) 
{ 
    fprintf(stderr, "Cannot open `test.txt'\n"); 
    return -1; 
} 

while (((chr = fgetc(file)) != EOF) && (chr == ' ')) 
    printf("space\n"); 

你应该声明intchr,因为fgetc()回报int,例如EOF要求是int而不是char

此外,调试模式是用于跟踪变量的值是有用的,我敢打赌,它可以在五你在ASCII或十进制或十六进制的值,如您需要,如果你知道如何提问。

+0

当我使用一个文件时,fgetc和getc有什么区别? 和我改变c为int,但他现在比较字符的代码ASCII与另一个字符..现在它是一个无限循环 – Programmer

+0

这是一个[实现细节](http://man7.org/linux/man-pages /man3/ungetc.3.html)与你的probelem非常不相干。 –

+0

非常感谢,但我将如何让编译器测试空间的角色? – Programmer