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(  。 不好意思! |