【发布时间】: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 来满足解析需求。在这种情况下,这正是您所需要的