【问题标题】:C - File Input/Validation LINUX/Windows IssueC - 文件输入/验证 LINUX/Windows 问题
【发布时间】:2012-02-13 12:00:16
【问题描述】:
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 函数中,即使值正确,它也总是打印“不正确”。此代码在 Windows 中 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;
}

我已经使用 mingw32 c 编译器在 Windows 上进行了尝试,它运行良好。 它读取的文件仅包含每行 8 位长的十六进制值。

谁能看到代码哪里出错了?或者为什么它在 Linux 中的工作方式不同?

【问题讨论】:

  • too_______many_______________空间_______________请_____删除_________他们

标签: c windows linux validation file-io


【解决方案1】:

Linux 和 Windows 使用不同的行尾标记:Windows 使用 \r\n,而 Linux 使用 \n。您的文件使用哪种换行符?

如果你在 Linux 上读取一个用 windows 编写的文件,你会在字符串的末尾得到一个额外的\r

这是避免问题的一种方法:

int len = strlen(input);
if (input[len-1] == '\r') input[len-1] = '\0';

【讨论】:

  • 在文件中它只是行之间使用的回车键?并且在代码中它的 input[8] != '\0' 检查第 9 个字符是否是新行,如果“\n”是 Windows 中的新行,为什么第 9 个字符是“\0”并且它可以工作在 Windows 中很好...
  • @user983969 在 Windows 中,当您将 \n 写入操作系统将其转换为 \r\n 的文件时。见en.wikipedia.org/wiki/Newline
  • 所以我应该将 \0 替换为 \n 并且可以正常工作?
  • 用 \n 替换检查最后一个字符是否为换行符的 \0 在 linux 中仍然可以正常工作,但在 linux 中仍然可以正常工作
  • 不,因为\n 永远不会复制到不起作用的字符串中。您可以检查字符串的最后一个字符是否为\r
猜你喜欢
  • 2016-04-12
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2014-10-29
相关资源
最近更新 更多