C++中如何是实现从文件中同时读入字符和数据?
文件内容:北京10223天津20213河北30712918876黑龙江40257吉林503467内蒙古70845638101112山西804710318山东9043183...
文件内容:
北京 1 0 2 2 3
天津 2 0 2 1 3
河北 3 0 7 1 2 9 18 8 7 6
黑龙江 4 0 2 5 7
吉林 5 0 3 4 6 7
内蒙古 7 0 8 4 5 6 3 8 10 11 12
山西 8 0 4 7 10 3 18
山东 9 0 4 3 18 31 29
陕西 10 0 5 7 11 12 17 27
……………………………………
存储结构为邻接表,字符存入邻接表头结点,且头结点构成一个数组。
这个....用回车符换行的语句又该如何实现?请不吝指教....
强调一下,所用为 C++ 编程语言,不是 C !. 展开
北京 1 0 2 2 3
天津 2 0 2 1 3
河北 3 0 7 1 2 9 18 8 7 6
黑龙江 4 0 2 5 7
吉林 5 0 3 4 6 7
内蒙古 7 0 8 4 5 6 3 8 10 11 12
山西 8 0 4 7 10 3 18
山东 9 0 4 3 18 31 29
陕西 10 0 5 7 11 12 17 27
……………………………………
存储结构为邻接表,字符存入邻接表头结点,且头结点构成一个数组。
这个....用回车符换行的语句又该如何实现?请不吝指教....
强调一下,所用为 C++ 编程语言,不是 C !. 展开
4个回答
展开全部
//我的程序可以读以下形式的数据,主要实现了两个不定长
//1,空格不定长;2,空格隔开的数据补丁长。:
// temp.txt
//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(n个空格)aaaaaaaaaaa(n个空格)a aaaaaaaaaaaaaaaaaa(n个空格)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(n个空格)aaaaaaa
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define BUF_SIZE 100
#define oops dowhile(0) //出错处理,返回-1
//数据的链表,因为你的数据长度不可知,所以,我选择用链表处理
typedef struct LinkNode
{
char *cdata;
int length;
struct LinkNode *next;
}*LinkList;
int read_data(LinkList *L,FILE *fp);
void Add2List(LinkList *Ltail,char *data,int length,int cat);
void show_data(LinkList L);
void main()
{
LinkList L=NULL;
FILE *fp;
if((fp = fopen("temp.txt","r"))==NULL)
oops;
read_data(&L,fp);
show_data(L->next );
}
//显示链表中的数据
void show_data(LinkList L)
{
while(L)
{
printf("%s\t%d\n",L->cdata ,L->length );
L= L->next ;
}
}
//把文件中的数据读入链表
int read_data(LinkList *L,FILE *fp)
{
size_t readbytes = 0,i = 0,j = 0;
int line_cat = 0;
long file_len;
LinkList Ltail = NULL;
fseek(fp,0,SEEK_END);
file_len = ftell(fp);
fseek(fp,0,SEEK_SET); //这三行用来获得文件长度
//头结点为空,然后头结点后的都用来存储数据。
if((*L = Ltail = (LinkList)malloc(sizeof(struct LinkNode))) == NULL)
oops;
char buf[1025];
while((file_len -= readbytes) != 0) //若发现读完,则退出
{
if((readbytes = fread(buf,1,1024,fp)) == -1)
oops;
buf[readbytes] = 0;
i = 0;
j = 0;
while( i < readbytes)
{
if(buf[i]==' ') //若当前字符串为空格,则
{ //插入有j -> i 的数据至
//链表
buf[i] = 0;
if(line_cat) //判断前面读的一行,是否没有空格,如果前面一行无空格,则把此数据连接到当前尾节点的字符,如果有空格则新建一个节点,并把数据复制到节点
{ Add2List(&Ltail,&buf[j],i-j,1);
line_cat = 0;
}
else
Add2List(&Ltail,&buf[j],i-j,0);
while(buf[++i] == ' ') ;
j = i;
}
++i;
}
if(j == 0 ) //如果整行都没有发现空格,则把数据保存。
{
if(line_cat) //同上。
{
Add2List(&Ltail,&buf[j],i-j,1);
line_cat = 0;
}
else
Add2List(&Ltail,&buf[j],i-j,0);
line_cat = 1;
}
}
return 0;
}
//保存字符串data到链表中。cat指示数据是否连接到当前节点,还是复制到新建的节点。
void Add2List(LinkList *Ltail,char *data,int length,int cat)
{
if(!cat)
{
if(((*Ltail)->next = (LinkList )malloc(sizeof(struct LinkNode))) == NULL)
oops;
*Ltail = (*Ltail)->next ;
if(((*Ltail)->cdata = (char *)malloc(length + 1)) == NULL)
oops;
strcpy((*Ltail)->cdata ,data);
(*Ltail)->next = NULL;
(*Ltail)->length = length;
}
else
{
if(((*Ltail)->cdata = (char *)realloc((*Ltail)->cdata ,strlen((*Ltail)->cdata )+length + 1)) == NULL)
oops;
strcat((*Ltail)->cdata ,data);
(*Ltail)->length +=length;
}
}
//最后程序没有释放内存,楼主可以自己释放试试。还有,此程序有点难度,新手可能比较难懂。嘻嘻。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
//1,空格不定长;2,空格隔开的数据补丁长。:
// temp.txt
//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(n个空格)aaaaaaaaaaa(n个空格)a aaaaaaaaaaaaaaaaaa(n个空格)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(n个空格)aaaaaaa
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define BUF_SIZE 100
#define oops dowhile(0) //出错处理,返回-1
//数据的链表,因为你的数据长度不可知,所以,我选择用链表处理
typedef struct LinkNode
{
char *cdata;
int length;
struct LinkNode *next;
}*LinkList;
int read_data(LinkList *L,FILE *fp);
void Add2List(LinkList *Ltail,char *data,int length,int cat);
void show_data(LinkList L);
void main()
{
LinkList L=NULL;
FILE *fp;
if((fp = fopen("temp.txt","r"))==NULL)
oops;
read_data(&L,fp);
show_data(L->next );
}
//显示链表中的数据
void show_data(LinkList L)
{
while(L)
{
printf("%s\t%d\n",L->cdata ,L->length );
L= L->next ;
}
}
//把文件中的数据读入链表
int read_data(LinkList *L,FILE *fp)
{
size_t readbytes = 0,i = 0,j = 0;
int line_cat = 0;
long file_len;
LinkList Ltail = NULL;
fseek(fp,0,SEEK_END);
file_len = ftell(fp);
fseek(fp,0,SEEK_SET); //这三行用来获得文件长度
//头结点为空,然后头结点后的都用来存储数据。
if((*L = Ltail = (LinkList)malloc(sizeof(struct LinkNode))) == NULL)
oops;
char buf[1025];
while((file_len -= readbytes) != 0) //若发现读完,则退出
{
if((readbytes = fread(buf,1,1024,fp)) == -1)
oops;
buf[readbytes] = 0;
i = 0;
j = 0;
while( i < readbytes)
{
if(buf[i]==' ') //若当前字符串为空格,则
{ //插入有j -> i 的数据至
//链表
buf[i] = 0;
if(line_cat) //判断前面读的一行,是否没有空格,如果前面一行无空格,则把此数据连接到当前尾节点的字符,如果有空格则新建一个节点,并把数据复制到节点
{ Add2List(&Ltail,&buf[j],i-j,1);
line_cat = 0;
}
else
Add2List(&Ltail,&buf[j],i-j,0);
while(buf[++i] == ' ') ;
j = i;
}
++i;
}
if(j == 0 ) //如果整行都没有发现空格,则把数据保存。
{
if(line_cat) //同上。
{
Add2List(&Ltail,&buf[j],i-j,1);
line_cat = 0;
}
else
Add2List(&Ltail,&buf[j],i-j,0);
line_cat = 1;
}
}
return 0;
}
//保存字符串data到链表中。cat指示数据是否连接到当前节点,还是复制到新建的节点。
void Add2List(LinkList *Ltail,char *data,int length,int cat)
{
if(!cat)
{
if(((*Ltail)->next = (LinkList )malloc(sizeof(struct LinkNode))) == NULL)
oops;
*Ltail = (*Ltail)->next ;
if(((*Ltail)->cdata = (char *)malloc(length + 1)) == NULL)
oops;
strcpy((*Ltail)->cdata ,data);
(*Ltail)->next = NULL;
(*Ltail)->length = length;
}
else
{
if(((*Ltail)->cdata = (char *)realloc((*Ltail)->cdata ,strlen((*Ltail)->cdata )+length + 1)) == NULL)
oops;
strcat((*Ltail)->cdata ,data);
(*Ltail)->length +=length;
}
}
//最后程序没有释放内存,楼主可以自己释放试试。还有,此程序有点难度,新手可能比较难懂。嘻嘻。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
展开全部
使用fgets()函数,每次读取一行,到回车符结束,每次读一行到buffer缓冲区,然后再做处理。整个大循环用while(!feof(fpFile)),fpFile为文件指针。feof()判断是否到了文件结尾。
fgets()函数的机理就是读取到换行符结束.
fgets()函数的机理就是读取到换行符结束.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已使用c的标准库函数:open();fscanf();close()
fscanf(*fp,"%s %d %d %d %d %d",s,&d1,,&d2,&d3,&d4,&d5)如果第一个字符串里没空格的话可以。
也可使用MFC离得CFile类。
fscanf(*fp,"%s %d %d %d %d %d",s,&d1,,&d2,&d3,&d4,&d5)如果第一个字符串里没空格的话可以。
也可使用MFC离得CFile类。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用每个回车符分行,每行第一个空格区分头和后面的数据
C++也有'\n'啊。。有什么不可以的??
C++也有'\n'啊。。有什么不可以的??
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询