关于C语言里面fscanf的问题

jacksonsnake 2008-07-18 09:45:48
有下面两种不同风格的txt文件都包含要处理的数据,导师要求用一个程序就能处理这两个文件的数据
------------------------------------------------
! Polyphase Legendre Sequence: L = 127 u = 3 q = 32 Class unknown

0 30 8 1 18 23 9 19 26 2
1 4 19 30 29 24 4 6 10 20
9 20 14 25 27 16 8 3 7 17
2 14 12 5 14 12 20 2 30 31
19 16 30 7 22 25 3 28 5 8
24 7 16 11 11 29 15 21 27 23
10 14 22 21 22 23 15 11 24 26
22 16 28 12 12 17 6 25 9 4
27 4 26 23 8 29 17 18 0 29
3 19 13 15 6 13 13 1 18 6
2 7 15 28 26 13 21 10 21 11
5 3 25 28 31 18 5 0 1 27
20 10 24 17 0 9 31
------------------------------------------------
------------------------------------------------
!Sequence generated using F:\project\Genss2.exe

!James Melville and Dr. H. Green,
!University of Manchester, 2006

!Prime(p):5
!Order(n):2
!Sequence Modification Value (k):1
!Undefined Element Value(s):0
!Number of Phases(m):32
!Poly Co-eff's(u):3 2
0 8 11 13 20 16 6 10 1 14 7 2 18 3 9 17 5 15 12 23 4 22 21 19
1 32 0 4 14 8 30 7 18 2 1 9 13 24 31
!Undefined Element aligned to index 0
------------------------------------------------
文件中的空白行都是只有"/n",但两文件不同处在于前者的数据行以空格开头,后者直接上数据并且数据后面还有一陈述字符串。

我想问如果用fscanf(fp, "%d, buf)读"!"或者"/n"或者"/0"的时候是读出NULL,还是ACSII码?因为非数据行里面也有整数,我想做的是当buf被判断为不是整数时不处理并用while循环至该行结尾,当buf是整数时则把数据放近数组data[i]里面。

------------------------------------------------
int main()
{
FILE *fp;
fp=fopen("C://sequence.txt","r");
int buf=0;
int i=0;
int data[2014];
while()
{
fscanf(fp, "%d", buf);
if(!(isdigi(buf))
{
if(fscanf(fp, "%s")=="/0")
break;
else
while(fscanf(fp, "%s")!="/n");
)
else
{
data[i]=buf;
i++;
}

for(int k=0; k<=i; k++)
printf("%d ", data[k]);
}
-------------------------------------------------

不过此程序并不能成功运行,是不是我使用fscanf的方式有问题?
...全文
695 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttkk_2007 2008-07-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jacksonsnake 的回复:]
有个不懂的地方,fgets(buf, LINE_SIZE, fp)是读字符的,这样不会把32读成3、2么?
[/Quote]
fgets,读一行,放到buf里,不会把32读成3,2
genius_dragon 2008-07-19
  • 打赏
  • 举报
回复
借此平台
学习学习
jacksonsnake 2008-07-19
  • 打赏
  • 举报
回复
受教了,谢谢
brookmill 2008-07-19
  • 打赏
  • 举报
回复
2楼代码的思路是:每次读取一行文本保存到buf,如果判断这一行是数据,再从buf里逐个读出整数保存到data
ptr移动的那部分写的不好,暂时也想不出更好的办法。
只要LZ会用debug,把所有代码单步执行一遍,应该能看明白。要是还不会debug,一定要想法学会,太有用了。
brookmill 2008-07-19
  • 打赏
  • 举报
回复
    while (1)
{
if (fgets(buf, LINE_SIZE, fp) == NULL) /* 从文件里读取一行文本到buf */
break; /* 如果fgets返回NULL,说明文件结束,跳出循环 */
this_line_is_data = 1;
for (i = 0; buf[i]; i++) /* 对刚读进来的文本逐个字符进行判断 */
{
if (!isdigit(buf[i]) && !isspace(buf[i]))
{ /* 如果本行有任何一个字符既不是数字也不是空白字符,就认为本行不是有效数据 */
this_line_is_data = 0;
break;
}
}
if (!this_line_is_data)
continue; /* 不是有效数据,对本行文本不做处理,继续读下一行 */

/* 现在buf里的内容是" 0 30 8 1 18 23 9 19 26 2 " */
ptr = buf; /* ptr指向本行开头 */
while (1)
{ /* 从一行文本里逐个读出整数,每次循环读取一个 */
while (isspace(*ptr))
ptr++; /* 移动ptr,跳过空格,到下一个数字 */
if (sscanf(ptr, "%d", data+total) <= 0) /* 从ptr指向的内存读出一个整数 */
break; /* 如果sscanf返回0,说明本行结束,跳出循环 */
total++;
while (isdigit(*ptr))
ptr++; /* 移动ptr,跳过刚读取的数字,到下一个空格 */
}
}
jacksonsnake 2008-07-19
  • 打赏
  • 举报
回复
有个不懂的地方,fgets(buf, LINE_SIZE, fp)是读字符的,这样不会把32读成3、2么?
brookmill 2008-07-19
  • 打赏
  • 举报
回复
LZ还是得自己多下点功夫啊,很多最基本的东西还没掌握,教科书看的不仔细
编译器报了错,要学会自己一行一行改呀
brookmill 2008-07-19
  • 打赏
  • 举报
回复
随便写了一点代码,其实写的挺烂的,不过总算能实现功能。
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define LINE_SIZE 256
#define DATA_SIZE 1024
#define FILENAME "sequence.txt"

int main()
{
int i;
int total = 0;
int this_line_is_data;
char buf[LINE_SIZE];
int data[DATA_SIZE];
FILE *fp = NULL;
char *ptr = NULL;

fp = fopen(FILENAME, "r");
if (fp == NULL)
{
printf("Failed to open file %s\n", FILENAME);
return 1;
}

while (1)
{
if (fgets(buf, LINE_SIZE, fp) == NULL)
break;
this_line_is_data = 1;
for (i = 0; buf[i]; i++)
{
if (!isdigit(buf[i]) && !isspace(buf[i]))
{
this_line_is_data = 0;
break;
}
}
if (!this_line_is_data)
continue;

ptr = buf;
while (1)
{
while (isspace(*ptr))
ptr++;
if (sscanf(ptr, "%d", data+total) <= 0)
break;
total++;
while (isdigit(*ptr))
ptr++;
}
}

printf("%d intergers read.\n", total);
for (i = 0; i < total; i++)
printf("%d ", data[i]);
printf("\n");
}
ttkk_2007 2008-07-18
  • 打赏
  • 举报
回复
if(fscanf(fp, "%s")=="/0")
=======================
这是什么?,fscanf都少了一个参数,而且fscanf的返回值是个int,你怎么还和一个字符串比?什么意思
里面都是我新手时期学C的时候整理的一些TXT文档,因为分不够了,所以放上来赚点积分,都是很基础的东西,里面的代码都是经过我测试的,保证可用。 (1)输出Hello,world (2)标识符 (3)常量与变量 (4)整型数据 (5)实型数据 (6)复合赋值表达式 (7)自加自减运算符和逗号表达式 (8)顺序结构及数据输出 (9)数据输入 (10)作业练习一 (11)关系运算符和逻辑运算符 (12)选择结构及条件表达式 (13)循环结构,while语句 (14)循环结构,do while语句 (15)循环结构,for语句 (16)字符型数据 (17)字符型数据实例,作业练习二 (18)函数定义 (19)函数应用实例,作业练习三 (20)指针的定义 (21)函数之间地址值的传递 (22)函数返回地址值 (23)一维数组的定义 (24)一维数组应用实例 (25)一维数组应用实例(2) (26)一维数组应用实例(3) (27)二维数组的定义 (28)二维数组的初始化 (29)二维数组与指针 (30)二维数组应用实例 (31)二维数组应用实例(2) (32)用一维数组来存储字符串 (33)字符串的输入与输出 (34)字符串数组 (35)用于字符串处理的函数 (36)字符串应用实例 (37)传给Main函数的参数 (38)函数指针 (39)函数的递归调用 (40)变量作用域和存储类别 (41)编译预处理和不带参数的宏替换 (42)带参数的宏替换和文件包含 (43)动态存储分配 (44)结构体变量的定义与引用 (45)利用结构体变量构成静态链表 (46)利用结构体变量构成动态链表 (47)共用体的定义与应用 (48)位运算符 (49)File文件的数据输出操作 (50)File文件的数据输入操作 (51)判断文件结束函数 (52)fscanf和fprintf函数 (53)fgets和fputs函数 (54)fread和fwrite函数 (55)文件定位函数 c switch的用法 c 避免调试窗口闪退 c 弹出消息窗口 c 等待函数(sleep) c 定义类成员 c 动态分配内存法定义数组 c 返回二维数组 c 方向键键码 c 改变字体颜色 c 绘制图形 c 获得鼠标当前位置坐标 c 检测键盘按键 c 检测鼠标按下事件 c 将整数转换成二进制数并存放到数组中 c 结构体问题 c 使用winsock实现server和client(通讯程序) c 随机数发生器 c 图形模式详解 c 网页爬虫 c 写图形界面 c 遗传算法实例 c 在图形界面输出文字 c# List的用法 VS2010如何解决每次编译都要重新生成

70,034

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧