getline(data.txt,line)相关问题 c++

时间:2021-12-29 13:30:56
//数据加载
void read_data()
{
string line;

ifstream data("data.txt");  //打开流
if(!data) cout<<"Can't open data file!"<<endl;

while(getline(data,line))        //开始逐行读取
{
test_count++;
int i=0,j=0,temp=0;
//首先将逗号全部转为空格,以便后续处理
for(int i=0;i<line.size();i++)
if( line[i]==',')  line[i]=' ';  
/*测试行1
    if(test_count==1)   cout<<"前数"<<line[i]<<line[i+1]<<line[i+2]<<line[i+3]<<line[i+4]<<line[i+5]<<line[i+6]<<line[i+7]<<line[i+8]<<line[i+9]<<line[i+10]<<line[i+11]<<"*****"<<line.size();//line【i】=1 
        if(test_count==2)   cout<<"前数"<<line[i]<<line[i+1]<<line[i+2]<<line[i+3]<<line[i+4]<<line[i+5]<<line[i+6]<<line[i+7]<<line[i+8]<<line[i+9]<<line[i+10]<<line[i+11]<<"*****"<<line.size();//line【i】=1 
*/
//然后逐行处理
stringstream ss(line);
ss>>i;
// if(test_count==1)   cout<<"+++"<<i;//i=12633
nodes[i].id=i;                  //保留该节点id信息,节点id同节点索引一致
if( i > nodes_max ) nodes_max=i;     //更新得到最大节点id,未见得是节点数目
// if(test_count==1)   cout<<"---"<<nodes_max;
ss>>j;          //节点i的链出节点id,i->j
nodes[i].linkout_id.push_back(j);  //将其链入到该节点的linkout向量
nodes[j].linkin_id.push_back(i);  //同时,将该节点加入到相应节点的linkin向量
ss>>temp;                            //结尾标记符1,毫无用处
}          //至此,逐行处理完毕
data.close();                  //关闭流类对象


为什么逐行读入的时候刚好读到两个数字后面的1为止,line是定义的string,data文件本身也没有什么问题,从哪里做的设置呢?下面是数据文件的图片

getline(data.txt,line)相关问题 c++

2 个解决方案

#1


没看懂你问的是什么

#2


乍看起来c++的cin、cout、ifstream、ofstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite简单,不用格式控制符!
但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。
摒弃cin、cout、ifstream、ofstream!
使用scanf、printf、fscanf、fprintf、fread、fwrite。

仅供参考:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.

#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int i,z;
int b,n,L;
int main(int argc,char **argv) {
    if (argc<2) {
        printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);
        return 1;
    }
    f=fopen(argv[1],"r");
    if (NULL==f) {
        printf("Can not open file [%s]!\n",argv[1]);
        return 2;
    }
    z=0;
    b=0;
    n=0;
    L=0;
    while (1) {
        if (NULL==fgets(ln,MAXLEN,f)) break;
        L=strlen(ln);
        if ('\n'==ln[L-1]) {
            if (0==z) {
                for (i=0;i<L-1;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L-1) z=1;//当前行不是空行
            }
            if (0==z) b++; else n++;
            z=0;
        } else {
            if (0==z) {
                for (i=0;i<L;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L) z=1;//当前行不是空行
            }
        }
    }
    fclose(f);
    if (L>0 && '\n'!=ln[L-1]) {
        if (0==z) b++; else n++;//最后一行末尾无'\n'也计算
    }
    printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);
    return 0;
}

#1


没看懂你问的是什么

#2


乍看起来c++的cin、cout、ifstream、ofstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite简单,不用格式控制符!
但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。
摒弃cin、cout、ifstream、ofstream!
使用scanf、printf、fscanf、fprintf、fread、fwrite。

仅供参考:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.

#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int i,z;
int b,n,L;
int main(int argc,char **argv) {
    if (argc<2) {
        printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);
        return 1;
    }
    f=fopen(argv[1],"r");
    if (NULL==f) {
        printf("Can not open file [%s]!\n",argv[1]);
        return 2;
    }
    z=0;
    b=0;
    n=0;
    L=0;
    while (1) {
        if (NULL==fgets(ln,MAXLEN,f)) break;
        L=strlen(ln);
        if ('\n'==ln[L-1]) {
            if (0==z) {
                for (i=0;i<L-1;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L-1) z=1;//当前行不是空行
            }
            if (0==z) b++; else n++;
            z=0;
        } else {
            if (0==z) {
                for (i=0;i<L;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L) z=1;//当前行不是空行
            }
        }
    }
    fclose(f);
    if (L>0 && '\n'!=ln[L-1]) {
        if (0==z) b++; else n++;//最后一行末尾无'\n'也计算
    }
    printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);
    return 0;
}