【问题标题】:Parsing simple numbers (ASCII) file in C doesn't work在 C 中解析简单数字 (ASCII) 文件不起作用
【发布时间】:2018-03-24 17:26:05
【问题描述】:

我有一个简单的文件,其中有 64 个数字 (0-16) 用列分隔,然后是一个特殊数字 (0-9),后面带有换行符 '\n',然后是另一组 64 个数字,1 个特殊数字和换行符。 (reference 用于文件)

#define EXAMPLES 100
#define INPUT 64
#define OUTPUT 10

double s_input [EXAMPLES][INPUT]  ={0};
double s_output[EXAMPLES][OUTPUT] ={0};


int main (int argc, char* argv[]) {
  FILE* f = open("path/to/file","r");
  if (!f) return 1;

  Read_Data_tra(f, s_input, s_output);
  return 0;
}

void Read_Data_tra(FILE*f, double input[EXAMPLES][INPUT], double output[EXAMPLES][OUTPUT]){
  char buff[3];
  double label;
  buff[2] = '\0';
  for(int i=0;i<EXAMPLES;i++){
    for(int y=0;y<64;y++){
        fread(&buff[0],1,1,f);
        fread(&buff[1],1,1,f);
        if(buff[1] != ','){
            buff[2] = '\0';
            input[i][y] = strtol(buff,NULL,10);
            fseek(f, 1, SEEK_CUR);
        }else{
            buff[1] = '\0';
            input[i][y] = strtol(buff,NULL,10);
        }
    }
    fread(&buff[0],1,1,f);
    fread(&buff[1],1,1,f);
    if(buff[1] != '\n'){
        buff[2] = '\0';
        label = strtol(buff,NULL,10);
    }else{
        buff[1] = '\0';
        label = strtol(buff,NULL,10);
    }
    for(int c=0;c<10;c++){
        if(c == label){
            output[i][c] = 1;
        }else{
            output[i][c] = 0;
        }
    }
  }
}

如果我复制此代码,例如第一行 10 次,让它读。没问题。但是,如果我按原样读取文件,它将停止在第 5 个示例上工作。它跳过随机数。这条线就像 0,0,5,14,4,0... 它跳过了 4。无处不在。然后它被偏移 1 并且由于明显的原因不起作用。您可能想自己查看file(只有几kB)。

我知道这可能会被否决/关闭,但你知道.. 我很绝望,如果只有一个提示,我会去做。

【问题讨论】:

  • 这是您的一个提示:创建一个minimal reproducible example
  • 你是如何打开那个文件的?根据您的描述,它听起来像是一个纯文本文件,但您使用 fread - 一次一个字符。当您改用fgetc 时,您的问题会消失吗?
  • 或使用fscanf
  • 看来读取第65个特殊数字的部分代码也可能有误。您自己说第 65 位只有一个字符,但它似乎在搜索一两个字符。这可能会在buff[1] == EOF 时导致文件末尾出现问题,从而导致 strtol 失败。不确定这是否是导致此问题的原因,但这是一个潜在问题。不过,我还不能复制你的问题
  • 很高兴能够提供帮助。生病将我的评论复制到答案中,以便可以关闭。我建议将来研究 strtok 来满足解析需求。在这种情况下,这正是您所需要的

标签: c file ascii


【解决方案1】:

看来读取第65个特殊数字的部分代码也可能有误。

您自己说第65位只有一个字符,但它似乎在搜索一两个字符。

这可能会在buff[1] == EOF 时导致文件末尾出现问题,从而导致strtol 失败。

(从评论中复制以允许关闭)

【讨论】:

  • 我还建议您查看 Ulrich 的评论。我无法复制这个问题,所以这都是猜测。我建议将您的代码复制到一个空白程序中,并确保它可以在发布之前自行运行。您如何打开文件句柄、#defines 以及声明两个数组参数的方式的样板代码都可能是相关的。
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多