文件的读写问题----读

发表于:2007-05-25来源:作者:点击数: 标签:问题----读写文件
对文件的读写操作不太熟悉,请教一个问题 有一个文件a.txt内容为: 011020073 011090074 011010079 011080080 。。。。。。 现在我要写个程序将该文件的每行的前面的4位取出来,请问该如何取? HopeCao 回复于:2003-06-16 16:09:11 strncpy???? 数据文

对文件的读写操作不太熟悉,请教一个问题
 有一个文件a.txt内容为:
011020073
011090074
011010079
011080080
。。。。。。
现在我要写个程序将该文件的每行的前面的4位取出来,请问该如何取?

 HopeCao 回复于:2003-06-16 16:09:11
strncpy????

数据文件中有数据???

 sandy_23678 回复于:2003-06-16 16:20:09
还是没用,a.txt文件里有数据的
奇怪了

 蓝色键盘 回复于:2003-06-16 11:42:06
fread后,memcpy或者strncpy4个
或者
cut

 无双 回复于:2003-06-16 11:41:40
fgets(fp,a,1000);
a[4]=0

 sandy_23678 回复于:2003-06-16 12:46:47
两位斑竹可能都有点搞错我的意思了
  其实我是想取每行从i位到i+4位的内容,因为
  比如我想把每行的5位到9位取出来(i=5),
  而不一定是从0位开始的,
  我主要不知道该如何将每行的的特定的字符串取出来,请各位指点

 tyffly 回复于:2003-06-16 12:51:56
那不是一样吗?
memcpy
strncpy把地址移几位就行了

 sandy_23678 回复于:2003-06-16 13:28:00
我问的是每行的处理方法,mempy函数我会用  
实际情况是这样的:
  我的txt文档实际上是数据库的表test里的数据
  每行的的不同位数都代表表里不同的列:
  比如:1-4代表列id里的数据
            5-7代表列taskid里的数据
            7-12代列host里的数据
  现在我就是要将每行里的对应的值添到表中,请问该如何实现?

 li2002 回复于:2003-06-16 18:37:05
while(!feof(fp)){

......

}

 sandy_23678 回复于:2003-06-16 14:51:03
自己顶

 HopeCao 回复于:2003-06-16 14:59:21
fgets(fp, a, MAXLEN);
strncpy(temp1, a, n);
strncpy(temp2, a+n, m);
.....
你看这样子行不行?

 sandy_23678 回复于:2003-06-16 15:20:09
这样的话好象只能取到第一行的数据,可是我txt文本有很多行,我要把每行的数据都添进去

 HopeCao 回复于:2003-06-16 15:22:21
while到文件结束不就OK了? 

 sandy_23678 回复于:2003-06-16 15:26:56
但是我觉得还是有点问题:
     我的每行大约有900多个字符,每个文本都有100行,文件大小都有几百k,这样来写的话,我估计用这种方法来写可能运行非常慢,
    sql serve有没有将文本文件导入到数据库的功能,如果有的话就比较简单了?

 HopeCao 回复于:2003-06-16 15:30:39
应该没有问题的!

 sandy_23678 回复于:2003-06-16 15:34:45
斑竹觉得我那个方法行得通吗?
     还有你说的while到文件结束,如何判断文件到了结束??
    有点不太明白,请指点

 HopeCao 回复于:2003-06-16 15:39:18
man feof !

 sandy_23678 回复于:2003-06-16 15:48:14
char buf[2550];
 char temp1[10];
 char temp2[10];
.................    
 while(feof)
   {
   fgets(buf,2550,fp);
   memcpy(temp1,buf,4);
   memcpy(temp2,buf+4,3);
   ..................
   这样可以否?

 HopeCao 回复于:2003-06-16 15:52:24
while(!feof(fp))

 flw 回复于:2003-06-16 15:59:52
SQL 支持将文本文件导入到数据库中的。
用 Import & Export 工具就可以了。

 sandy_23678 回复于:2003-06-16 16:04:30
to hopecao:试过了,buf1里什么都没有
    to flw:请教该如何导入?

 HopeCao 回复于:2003-06-16 16:21:50
你把你的程序和数据帖出来瞧瞧!

 sandy_23678 回复于:2003-06-16 16:28:07
#include <stdio.h>
    main()
  {
     FILE *fp;
    char buf1[2550];
    char buf2[220],buf3[220];
    int i;
  if((fp=fopen("/test/a.txt","rb"))==NULL)
  {
   printf("open file error");
   exit(0);
  }
 while(!feof(fp))
 {
  fgets(buf1,255,fp);
  strncpy(buf2,buf1,11);
  strncpy(buf3,buf1+11,11);
 }
 printf("%s",buf1);
 printf("%s",buf2);
}
 输出的值都是空

 HopeCao 回复于:2003-06-16 16:37:17
你的printf放到最后去了!
test.c :
[code:1:b524590b71]
#include <stdio.h> 

int main(void) 

FILE *fp; 
char buf1[2550]; 
char buf2[220],buf3[220]; 
int i; 

if((fp=fopen("test.c","rb"))==NULL) 

printf("open file error"); 
exit(0); 

while(!feof(fp)) 

memset(buf1, 0, sizeof(buf2));
fgets(buf1,255,fp); 

memset(buf2, 0, sizeof(buf2));
strncpy(buf2,buf1, 11); 

memset(buf3, 0, sizeof(buf3));
strncpy(buf3,buf1+11, 11); 

printf("BUF1: %s\n", buf1); 
printf("BUF2: %s;   BUF3: %s\n", buf2, buf3); 

printf("Read eof!\n");

return 1;

[/code:1:b524590b71]

 sandy_23678 回复于:2003-06-16 16:42:10
里面应该没有关系的了,我既然把它纯到buf2,buf3里,在哪printf都没关系的吧,何况我是%s,不是%c,不过确实是有数据了,只不过重复了很多次

 HopeCao 回复于:2003-06-16 16:44:20
你不就是要一行一行的读然后操作到数据库里去吗???

 unicorns 回复于:2003-06-16 16:45:40
HopeCao是好同志
回答耐心细致
呵呵

 sandy_23678 回复于:2003-06-16 16:53:51
[quote:bb9813b653="HopeCao"]你不就是要一行一行的读然后操作到数据库里去吗???[/quote:bb9813b653]     
很奇怪的,我的a.txt文档在win2000下一行显示(内容比较长),
可到了linux就变成了几行来显示了,所以得到的结果还是不对
在2000下我的a.txt文档一行结束的标志是0x0d0x0a的

 zhanglw 回复于:2003-06-16 16:56:18
当数据库的一条记录的长度大于255时,这样每次读255个字符为一行会有问题吗?
如果一条记录超过255,就会变成2行,这样就读错了吧?

 unicorns 回复于:2003-06-16 16:58:36
学习ing

 HopeCao 回复于:2003-06-16 17:00:38
你的文件中是不有一些不可显的字符???

to zhanglw:
所以就有一个MAXLEN啊,要是你的MAXLEN是不可确定的,那就自己写一个readline了!

 sandy_23678 回复于:2003-06-16 17:02:09
[quote:0ac7d654dc="zhanglw"]当数据库的一条记录的长度大于255时,这样每次读255个字符为一行会有问题吗?
如果一条记录超过255,就会变成2行,这样就读错了吧?[/quote:0ac7d654dc]  
对呀,我的一行有900多个字符,该怎么办?

 sandy_23678 回复于:2003-06-16 17:13:03
我的里面没有不可见字符,空格倒是很多

 HopeCao 回复于:2003-06-16 17:20:58
那你在Linux下做一个试试,应该方法就这样!

 HopeCao 回复于:2003-06-16 17:21:22
那你在Linux下做一个试试,应该方法就这样!

 sandy_23678 回复于:2003-06-16 17:25:09
我的文本只能读不能写,是从远程服务器下载下来的,所以不能改,
    不过我还有一个地方很疑惑,为什么在while之外就不能printf出buf2呢,既然我已经把文件内容存储到缓冲区buf2,在哪也是可以printf出的呀

 HopeCao 回复于:2003-06-16 17:27:47
那是不是你最后有一个空行!

 sandy_23678 回复于:2003-06-16 17:31:37
对,以为我最后的内容长度是给了10,而实际长度只有5,
    空了5个格子后才回车换行的,也就是0x0d,0x0a

 zhanglw 回复于:2003-06-17 10:12:46
我昨天发的帖子被吃了?我写了代码呢

下面是伪码:
#include <stdio.h>
#include <string.h>

int rd()
{
File *fp;

char buf[4];

  while(!feof(fp))
  {
    memset(buf, 0, sizeof(buf));
    if((read(buf, 4, 1, fp)) <= 0)
        break;
    buf[4] = '\0';
    printf*"buf = [%s]\n", buf);
    
    for(;
   {
      if(fgetc(fp) == '\n')
      {
         printf("read end of this line\n");
         break;
       }
   }
  }
   return 0;
}

大致是这样,我已经试过了,当一行过长变成2行仍然是对的。(我是用MAXLEN = 88试的)

 flw 回复于:2003-06-17 10:49:21
回楼主:
在 ms sql server 7.0 中导入格式文本到数据库中的方法。( ms sql 2000  我没有环境,不过想来应该是差不多的。

本方法仅适用于“格式文本”,所谓格式文本是指,在不同的行中,相同的字段值相对于行首的偏移应该是恒定的,或者每个字段之间用固定的分隔符格开的文本文件。

假设:
你的计算机已经安装了下面将要使用的所有工具、驱动。

具体操作:
1,点击“开始”->“程序”->“Microsoft SQL Server 7.0”-> “Import and Export Data”,出现一个对话框“DTS Wizard”,
2,点击“下一步”。
3,选择 Source 为“Text File”。并且指定你要导入的文件。点击“下一步”。
4,最上面有一个选项,花开两路,各表一支,现在先说选择“Delimited”的情况,选择 File type 为“ANSI”,Skip 是指每行行首需要跳过的无效字符,比如记录号等等。Row 是你的行分割符,这个你应该比我清楚。
5,点击下一步,你将会看到已经有一个预览效果,如果不满意,可以上一步重来。注意这里还有一个分割符的设置。
6,如果没有问题的话,点击“下一步”,出现选择目标服务器的对话框。
选择 Destination 为“Microsoft ODBC Driver for SQL Server”,Server 当然就是你的 SQL Server 名称啦。登录方式随便,只要能登录上 SQL 就行了。Database 就是数据库名称,如果登录成功的话,就可以选择了,选择你要的目的数据库名。点击“下一步”。
7,选择目标表名称,默认是文本文件的名称。再点两次“下一步”。
8,确认所有信息。无误则点击“完成”,开始导入数据。
9,如果无误,会提示成功,否则当提示失败后,按“上一步”重导。
10,如果实在搞不定,欢迎咨询 QQ:116544783。     

如果在第四步选择 Fixed field  的话,点击下一步到第五步的时候,就不用选择分割符了,而是要手工选择每一列的位置。     

另:[color=red:772b0fdfe1][size=24:772b0fdfe1]你要编的程序已经有人替你编好了,这个程序就是大名鼎鼎的 BCP[/size:772b0fdfe1][/color:772b0fdfe1]

 lianghaibo_lhb 回复于:2003-06-17 11:49:46
看看fgets()函数的说明,它读定长字符到buff中,遇到换行或文件结束会停止读的。读出文件所有内容可以如下实现:

char buff[1024];  /*足够大,可以容下一行数据*/
memset( buff, 0x00, sizeof(buff) ;
while ( !fgets( buff, sizeof(buff), fp   

memcpy(temp1,buf,4); 
memcpy(temp2,buf+4,3); 
.................. 

memset( buff, 0x00, sizeof(buff) ;
}

使用字符串时最好养成memset()的习惯,由于编译器不同,有可能程序移植到其他机器会出现意料不到的结果。

 蓝色键盘 回复于:2003-06-17 12:45:29
该贴回答的很精彩,尤其是hopecao的耐性,值得发扬光大!

 HopeCao 回复于:2003-06-17 12:50:40
谢谢!

 蓝色键盘 回复于:2003-06-17 13:18:47
flw兄对于ms sql server 7.0 中导入格式文本到数据库中的方法的描述,看了以后,估计小学生操作都没什么问题。

 flw 回复于:2003-06-17 14:03:43
版主过奖了。本来我前面已经提示过楼主了,但是他没有明白,所以不妨写清楚些。

 lianghaibo_lhb 回复于:2003-06-18 08:13:39
上面我的帖子程序有个低级错误,循环条件应该不用加 !。
    应该是 while ( fgets(  
    不好意思!

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)