j***3 发帖数: 142 | 1 只要window size超过79程序就出错(report “Bad Data”) 。
http://www.cs.bc.edu/~clote/ComputationalMolecularBiology/ENTROPY/entropyPlot1.c
出错的部分在”Nucl indexPlus“
老虎肉提示可能是非法字符问题。后检查发现input file的每一行都是79个字符,然后
有个换行符。用
perl -l0pe0
去除input file 里所有的new line 后程序就没有问题了。 请问可不可以在source
code 里改一下,ignore 所有的new line?怎么改呢。谢谢了 |
g****y 发帖数: 436 | 2 在input部分,if c=fgetc(in) != '\n' 。但是与其这样,不如你之前确保你的输入
文件没有问题。
【在 j***3 的大作中提到】 : 只要window size超过79程序就出错(report “Bad Data”) 。 : http://www.cs.bc.edu/~clote/ComputationalMolecularBiology/ENTROPY/entropyPlot1.c : 出错的部分在”Nucl indexPlus“ : 老虎肉提示可能是非法字符问题。后检查发现input file的每一行都是79个字符,然后 : 有个换行符。用 : perl -l0pe0 : 去除input file 里所有的new line 后程序就没有问题了。 请问可不可以在source : code 里改一下,ignore 所有的new line?怎么改呢。谢谢了
|
j***3 发帖数: 142 | 3 请问main 里的这一段不是已经 考虑了new line的问题了吗,因为用window size 小于
行字符数时程序没有问题啊?
/** continue processing **/
while ((ch = getc(in)) != EOF)
{
/* remove contribution for nucleotide freq for first char */
index1 = indexMinus(win[0], &a, &c, &g, &t);
index2 = index(win[1]);
/* remove contribution for nucleotide freq for first char */
pair[index1][index2]--;
/* move things down in window */
for (i=0;i
if |
g****y 发帖数: 436 | 4 你的sample和这个程序都有bug。
从程序来看,如果看到一个new line,它会再读入一个ch,判定是否EOF,但是判定完了
以后,没有用
ugetc()
把判定用字符推回去,然后马上进入下一个循环,又读了一次stream,相当于又丢失了
一个字符。
因此这个程序最终的结果基本是错误的。
另外一方面,可以断定你的sample file有几行不止一个new line或者空格或者制表符,
导致通过 != EOF的判断之后,indexMinus出错。
【在 j***3 的大作中提到】 : 请问main 里的这一段不是已经 考虑了new line的问题了吗,因为用window size 小于 : 行字符数时程序没有问题啊? : /** continue processing **/ : while ((ch = getc(in)) != EOF) : { : /* remove contribution for nucleotide freq for first char */ : index1 = indexMinus(win[0], &a, &c, &g, &t); : index2 = index(win[1]); : /* remove contribution for nucleotide freq for first char */ : pair[index1][index2]--;
|
j***3 发帖数: 142 | 5 谢谢ggplay, 是不是这样就可以了。另外我再想办法处理下input file format。
另外如果input file有几行不止一个new line或者空格或者制表符导致通过 != EOF的判断之后indexMinus出错的话,为
什么在window size 小于行字符数时,没有 indexMinus出错报告呢?
if ( ch == EOF ) break;
if ( ch == '\n' )
{
ch = fgetc(in);
if ( ch == EOF ) break;
ungetc(ch, in);
} |
t*******t 发帖数: 105 | 6 这个while循环一开始的地方也要ugetc。
【在 j***3 的大作中提到】 : 谢谢ggplay, 是不是这样就可以了。另外我再想办法处理下input file format。 : 另外如果input file有几行不止一个new line或者空格或者制表符导致通过 != EOF的判断之后indexMinus出错的话,为 : 什么在window size 小于行字符数时,没有 indexMinus出错报告呢? : if ( ch == EOF ) break; : if ( ch == '\n' ) : { : ch = fgetc(in); : if ( ch == EOF ) break; : ungetc(ch, in); : }
|
j***3 发帖数: 142 | 7 请问老虎肉为什么呢?
while循环一开始的地方没有判定是否new line啊? |
g****y 发帖数: 436 | 8 但是调用了getc
【在 j***3 的大作中提到】 : 请问老虎肉为什么呢? : while循环一开始的地方没有判定是否new line啊?
|
j***3 发帖数: 142 | 9 但是在 if 里面已经用ungetc push 了一次,在while 里又要 push一次吗?象这样:
/** continue processing **/
while ((ch = getc(in)) != EOF)
{
ungetc(ch, in);
/* remove contribution for nucleotide freq for first char */
index1 = indexMinus(win[0], &a, &c, &g, &t);
index2 = index(win[1]);
/* remove contribution for nucleotide freq for first char */
pair[index1][index2]--;
/* move things down in window */
for (i=0;i
|
t****t 发帖数: 6806 | 10 这个写得实在太混乱了, 我都没看明白你想要做什么. newline是一个重要的分隔符吗?
如果是, 那你想办法用fgets一次读入一行, 一行一行的处理. 如果不是, 那就用fread
一次读一个block, 或者写一个函数fgetc_skip_newline每次自动把newline跳过就好了
【在 j***3 的大作中提到】 : 但是在 if 里面已经用ungetc push 了一次,在while 里又要 push一次吗?象这样: : /** continue processing **/ : while ((ch = getc(in)) != EOF) : { : ungetc(ch, in); : /* remove contribution for nucleotide freq for first char */ : index1 = indexMinus(win[0], &a, &c, &g, &t); : index2 = index(win[1]); : /* remove contribution for nucleotide freq for first char */ : pair[index1][index2]--;
|
g****y 发帖数: 436 | 11 对。
【在 j***3 的大作中提到】 : 但是在 if 里面已经用ungetc push 了一次,在while 里又要 push一次吗?象这样: : /** continue processing **/ : while ((ch = getc(in)) != EOF) : { : ungetc(ch, in); : /* remove contribution for nucleotide freq for first char */ : index1 = indexMinus(win[0], &a, &c, &g, &t); : index2 = index(win[1]); : /* remove contribution for nucleotide freq for first char */ : pair[index1][index2]--;
|