C - Ввод / проверка файлов LINUX / Windows Issue - PullRequest
0 голосов
/ 13 февраля 2012
FILE *f;

char buffer[201];   
f=fopen("file.txt","r");

if (f==NULL)
{ 
    printf("file doesn't exist?!\n");return 1;
}

while(1)
{
    if ((fgets(buffer, 200, f) == NULL)) 
        break;

    instruction = validatehex(buffer);
    if(instruction == - 1) 
        continue;

    PC += 4;
    Decode(instruction,verbose);
}

Приведенный выше код получает входные данные из строки файла строкой, проверяющей его. Проблема в функции validatehex, которая всегда печатает «Неправильно», даже если значение верное. Этот код работает на 100% идеально в окнах, не в Linux (Ubuntu).

uint32_t validatehex(char input[])
{
    char hexchars[] = "1234567890abcdefABCDEF";
    uint32_t hexvalue = 0;
    char last;
    if((strlen(input) != strspn (input,hexchars)) && ((strlen(input)-1 != strspn (input,hexchars)) &&  input[8] != '\0'))
    {
        printf("NO CORRECT\n"); 
        return INERR;
    }

    sscanf(input,"%08x",&hexvalue);
    return hexvalue;
}

Я пробовал это в windows с компилятором mingw32 c, и оно отлично работает. Файл, из которого он читает, состоит из шестнадцатеричных значений длиной 8 цифр в каждой строке.

Кто-нибудь может увидеть, где код идет не так? Или почему он работает по-другому в Linux?

1 Ответ

1 голос
/ 13 февраля 2012

Linux и Windows используют разные маркеры конца строки: Windows использует \r\n, в то время как Linux использует \n.Какие разрывы строк использует ваш файл?

Если вы читаете файл, написанный в Windows на Linux, вы получите дополнительный \r в конце строки.

ЭтоОдин из способов избежать проблемы:

int len = strlen(input);
if (input[len-1] == '\r') input[len-1] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...