C中I/O期间打印的备用行
我正在尝试使用C更改文本文件的文本格式。 下面是我尝试过的代码。输出的问题是代码每隔一行就跳过文本文件 下面是我试图格式化的文件C中I/O期间打印的备用行,c,file,io,fgets,scanf,C,File,Io,Fgets,Scanf,我正在尝试使用C更改文本文件的文本格式。 下面是我尝试过的代码。输出的问题是代码每隔一行就跳过文本文件 下面是我试图格式化的文件 Protein 26709 1MET N 1 1.826 3.097 3.556 -0.457 0.365 -0.163 1MET H 2 1.769 3.168 3.512 -0.606 -0.305 -1.071 1MET H2 3 1.781 3.006 3.565 0.
Protein
26709
1MET N 1 1.826 3.097 3.556 -0.457 0.365 -0.163
1MET H 2 1.769 3.168 3.512 -0.606 -0.305 -1.071
1MET H2 3 1.781 3.006 3.565 0.271 0.041 0.264
1MET H3 4 1.857 3.125 3.649 1.251 -2.295 0.144
1MET CA 5 1.948 3.077 3.475 -0.538 -0.282 -0.098
1MET HA 6 1.987 2.977 3.504 -2.137 -0.912 -0.071
1MET CB 7 1.914 3.075 3.321 0.389 -0.161 -0.089
1MET HB2 8 1.848 2.987 3.306 -0.909 0.569 1.297
1MET HB3 9 1.869 3.176 3.311 -1.707 -1.073 -0.224
1MET CG 10 2.034 3.050 3.220 0.171 0.344 -0.271
我得到的结果是:
Protein
26709
1MET H 2 1.769 3.168 3.512 -0.606 -0.305 -1.071
1MET H3 4 1.857 3.125 3.649 1.251 -2.295 0.144
1MET HA 6 1.987 2.977 3.504 -2.137 -0.912 -0.071
1MET HB2 8 1.848 2.987 3.306 -0.909 0.569 1.297
1MET CG 10 2.034 3.050 3.220 0.171 0.344 -0.271
1MET HG3 12 2.017 2.974 3.140 2.388 1.184 -1.570
1MET CE 14 2.245 3.113 3.036 0.088 -0.370 0.744
1MET HE2 16 2.311 3.190 2.990 -0.737 -0.490 -0.665
1MET C 18 2.043 3.195 3.504 -0.052 -0.237 -0.714
以下是我尝试过的代码:
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
FILE *fp;
char buff[200],res[10],atm[10],atmNum[10],x[10],y[10],z[10],vx[10],vy[10],vz[10];
if (argc<2){
printf("SYTEM ABORT ! \n Provide the input GRO file");
exit(1);
}
else
fp=fopen(argv[1],"r");
while(fgets(buff,200,fp)!=NULL){
if (strlen(buff) > 10) {
fscanf(fp,"%s %s %s %s %s %s %s %s %s",res,atm,atmNum,x,y,z,vx,vy,vz);
if (strcmp(atm,"Na")){
printf("%7s %7s %5s %7s %7s %7s %7s %7s %7s",res,atm,atmNum,x,y,z,vx,vy,vz);
}
else
printf("%8s %7s %5s %7s %7s %7s %7s %7s %7s",res,atm,atmNum,x,y,z,vx,vy,vz);
}
else
printf("%s",buff);
}
fclose(fp);
return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
文件*fp;
字符buff[200],res[10],atm[10],atmNum[10],x[10],y[10],z[10],vx[10],vy[10],vy[10],vz[10];
如果(argc 10){
fscanf(fp、%s%s%s%s%s%s%s%s%s)、res、atm、atmNum、x、y、z、vx、vy、vz);
if(strcmp(atm,“Na”)){
printf(“%7s%7s%5s%7s%7s%7s%7s%7s%7s”)、res、atm、atmNum、x、y、z、vx、vy、vz;
}
其他的
printf(“%8s%7s%5s%7s%7s%7s%7s%7s%7s”)、res、atm、atmNum、x、y、z、vx、vy、vz;
}
其他的
printf(“%s”,浅黄色);
}
fclose(fp);
返回0;
}
从输出文件可以看出,第一行被跳过,我想这是由于在while
循环中使用了fgets
。但在那之后,它会打印每一行 但在这里使用fgets()和fscanf():
因此,您将使用fgets()读取一行,然后使用fscanf读取下一行,正如您所说的,这将导致跳过该行
正如WhozCraig所说,您应该使用,而不是。但是您在这里使用fgets()和fscanf(): 因此,您将使用fgets()读取一行,然后使用fscanf读取下一行,正如您所说的,这将导致跳过该行
正如WhozCraig所说,在
if
-块的正(长度>10)情况下,您应该使用sscanf
和刚刚使用fgets
提取的缓冲区作为数据源,而不是将其抛出并使用fscanf
获取下一行。坦率地说,您还应该检查scanf
的结果,以确保您将要使用的所有参数都已实际填充。不要做任何假设;假设是一切之母…@WhozCraig非常感谢,这是一个很容易解决的问题。在你的if
-block的正(长度>10)情况下,我很确定,您应该使用sscanf
和刚才使用fgets
提取的缓冲区作为数据源,而不是将其丢弃并使用fscanf
获取下一行。坦率地说,您还应该检查scanf
的结果,以确保您将要使用的所有参数都已实际填充。不要做任何假设;假设是一切之母…@WhozCraig非常感谢,这是一个简单的解决办法。是的,这是真的,但我不知道它也会跳过每一行。但是是的,它在一个while循环中运行。这是有道理的。谢谢:)不客气@PythonNoob,你提了一个很好的问题,这就是为什么我们能够提供帮助是的,没错,但我不知道它也会跳过每一行。但是是的,它在一个while循环中运行。这是有道理的。谢谢:)不客气@PythonNoob,你提了一个很好的问题,这就是为什么我们能够提供帮助
while(fgets(buff,200,fp)!=NULL)
if (strlen(buff) > 10) {
fscanf(fp,"%s %s %s %s %s %s %s %s %s",res,atm,atmNum,x,y,z,vx,vy,vz);