2015-02-07 2 views
-1

Здравствуйте, ребята, пожалуйста, помогите мне что-то понять!неверно читайте символ из файла txt

У меня есть txt-файл, и я читаю разные значения. Я делаю это успешно, но у меня тоже есть ASCII, т.е. KS98B2

Я пытаюсь прочитать его и сохранить в значении. Не могли бы вы посмотреть мой код? Слово «KS98B2» должно храниться в переменной «name». Поэтому я объявляю это в основном как символ. Вы согласны? Внутри функции «asc» есть putchar, и он напечатан правильно, я проверил это, я получаю KS98B2.

Но внутри функция по возрастанию Printf дает значение: 84122658 И внутри главного Printf дает значение: 24

Да, я помещал% D в Printf и имя является символом, но как это возможно, что переменная не то же самое? Как я могу заставить его работать? Пожалуйста, помогите мне !

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

 
FILE *file; 
 
char ch; 
 

 

 
int asc(char eow, bool *eof) { 
 
\t int var = 0; 
 
\t 
 
\t while((ch=fgetc(file))!=EOF) { 
 
\t \t putchar(ch); 
 
\t \t 
 
\t \t if ((ch >= 'A') && (ch <= 'Z')) { 
 
\t \t \t var <<= 4; 
 
\t \t \t var += (ch - 'A' + 65); 
 
\t \t } 
 
\t \t else if ((ch >= '0') && (ch <= '9')) { 
 
\t \t \t var <<= 4; 
 
\t \t \t var += (ch - '0'); 
 
\t \t } else if (ch == eow) { 
 
\t \t \t 
 
\t \t \t return var; 
 
\t \t } else { 
 
\t \t \t puts("Incorrect syntax.\n"); 
 
\t \t } 
 
\t } 
 
\t putchar('\n'); 
 
\t printf("Var inside asc %d\n", var); 
 

 
} 
 

 

 

 
int main() { 
 
\t char name; 
 
\t bool eof = false; 
 
\t \t 
 
\t if ((file = fopen("messages.txt", "r")) == NULL) { 
 
\t \t puts("WRONG FILE\n"); 
 
\t \t return 1; 
 
\t } 
 
\t while(!feof(file)) { 
 
\t \t 
 
\t \t name= asc('\n', &eof); 
 
\t 
 
\t \t printf("Var main: %d\n", name); 
 
\t } 
 
\t fclose(file); 
 
\t return 0; 
 
}

+3

Я думаю, вы обнаружите, что fgetc получает тип int, а не char. –

+0

Возвращаемое значение недействительно, когда отображается символ «Вар внутри asc ...». – BLUEPIXY

+0

Спасибо, ребята, за ваши комментарии. Итак, Дэвид, как вы предлагаете мне хранить значение этого слова в переменной и возвращать его? –

ответ

1
#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#include <ctype.h> 

FILE *file; 
//char ch;//There is no need to be a global variable 

int asc(char eow, bool *eof) { 
    int var = 0; 
    int ch;//Type in order to compare the EOF and value must be int 

    while((ch=fgetc(file))!=EOF) { 
     if(isupper(ch)) 
      var = var * 36 + (ch - 'A' + 10); 
     else if(isdigit(ch)) 
      var = var * 36 + (ch - '0'); 
     else if (ch == eow) 
      return var; 
     else { 
      fprintf(stderr, "\nIncorrect syntax.\n"); 
     } 
    } 
    *eof = true; 
    return var; 
} 

int main(void) { 
    int name;//It must be int to receive the value of int 
    bool eof = false; 

    if ((file = fopen("messages.txt", "r")) == NULL) { 
     puts("WRONG FILE\n"); 
     return 1; 
    } 
    while(!feof(file)) { 
     name= asc('\n', &eof); 
     printf("Var main: %d\n", name); 
    } 
    fclose(file); 
    return 0; 
} 

void putdecimal(int name) { 
    int i=0; 
    int var = name; 
    int array[30]; 
    int cnt = 0; 

    while(var){ 
     array[cnt++] = var % 36; 
     var /= 36; 
    } 

    for(i = cnt-1; i>=0; i--){ 
     if(array[i]<10) 
      putchar(array[i] + '0'); 
     else 
      putchar(array[i] - 10 + 'A'); 
    } 
} 
+0

'strtol (« KS98B2 », NULL, 36)' – BLUEPIXY

+0

Сначала я не понимаю, почему вы используете 36, можете ли вы объяснить это выражение? Кроме того, в ASCII символ A является десятичным числом 65, почему вы используете 10? Последнее, что вы напечатаете целое число, которое я печатаю 1256783438. Однако слово, которое у меня есть в ASCII, является KS98B2, которое является десятичным 75 83 57 56 66 50. Следовательно, то, что мы печатаем неправильно, не так ли? –

+0

@aredhel_vlsi 1) 36: 36 десятичных знаков. 2) +10: 'ABC ...' позиция 'A' означает' 10'. 3) '75 83 57 56 66 50' составляет 6 байт. Но Int - это 32-битная система, ожидается, что она будет 4 байта. вы хотите 'var << = 8'? Вы хотите сохранить персонаж для вас, почему int? Я думаю, что проблема будет решена, если вы передадите полученный персонаж за один раз. – BLUEPIXY

0

Пример для хранения считанных символов в массив.

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

FILE *file; 

char *gasc(int size, char buff[size], char eow){ 
    int i = 0, ch = 0; 

    while(i < size - 1 && (ch=fgetc(file))!=EOF && ch != eow){ 
     if (isupper(ch) || isdigit(ch)){ 
      buff[i++] = ch; 
     } else { 
      fprintf(stderr, "\nIncorrect syntax.\n"); 
     } 
    } 
    buff[i] = '\0'; 
    if(i == 0 && ch == EOF) 
     return NULL; 

    return buff; 
} 

int main(void) { 
    char name[20]; 

    if ((file = fopen("messages.txt", "r")) == NULL) { 
     puts("WRONG FILE\n"); 
     return 1; 
    } 
    //is_eof is no longer necessary to represent NULL return value of gasc instead of EOF. 
    while(gasc(sizeof(name), name, '\n') != NULL) { 
     printf("'%s'\n", name); 
    } 
    fclose(file); 
    return 0; 
} 
Смежные вопросы