由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请帮忙看一下这个c程序(更新)
相关主题
Python没有for loop我也问个UDP网络编程中遇到的问题
C++ Q13: Input如何快速读入文本形式的整数
问个SHELL SCIPT的问题请教一个简单的内存规范程序
python能检查出space是一个还是两个吗?C++ Q20: construction and inheritance
[转载] A shell script question. :)帮看看这个C++里trim last blanks,错在哪里?
^M字符是什么意思? (转载)问个缺少逗号的数组赋值问题
C++ string to int Problem问一个C Shell的sed用法。
问计算机词汇的翻译 -- flushASIO异步一问
相关话题的讨论汇总
话题: win话题: eof话题: ch话题: indexminus话题: index1
进入Programming版参与讨论
1 (共1页)
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]--;

1 (共1页)
进入Programming版参与讨论
相关主题
ASIO异步一问[转载] A shell script question. :)
python 小问题^M字符是什么意思? (转载)
给大家看个好玩的东西C++ string to int Problem
[转载] 简单的题都不敢做了.问计算机词汇的翻译 -- flush
Python没有for loop我也问个UDP网络编程中遇到的问题
C++ Q13: Input如何快速读入文本形式的整数
问个SHELL SCIPT的问题请教一个简单的内存规范程序
python能检查出space是一个还是两个吗?C++ Q20: construction and inheritance
相关话题的讨论汇总
话题: win话题: eof话题: ch话题: indexminus话题: index1