C语言可以说是我学习的第一门语言,不过似乎也是忘的最多的一门语言,自从因为项目需要重新拾起C语言,我的噩梦就开始了。
依稀记得大二学习数据结构时编程解决“约瑟夫环”、“迷宫”等问题后的骄傲,认为C简直就是天神一般的语言,如此强大,如此让人着迷。后来学了C++,后来开始搞.net,后来自学了CSS和简要的PHP,当C快被我抛弃的时候,由于种种原因,被分到一个新的项目,重新开始做C编程。
继语法树构造完之后自我放假了好久,这两天开工写了一段文件处理的代码,发现以前学习的C语言知识确实完全还给老师了,小崔,我对不起你啊,下面是遭遇问题小结。
1. 字符型转化为整型
如果不是正好用到,我想我永远不会知道居然还有标准库函数可以将字符串转换为任意类型(整型、长整型、浮点型等),我太无知了,我居然只知道强制类型转换,却从来没想过对于字符串要怎样处理,不过还好有人跟我一样不知道,哼哼。
atof():将字符串转换为双精度浮点型值;
atoi():将字符串转换为整型值;
atol():将字符串转换为长整型值;
strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字;
strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字;
strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。
用法非常简单,举例说明如下:
#include
#include
void main()
{
char lineno_str[20] = {"123"};
int lineno_int = atoi(lineno_str); //将字符串转化为整型值
printf("lineno_str : %s/n", lineno_str);
printf("lineno_int : %d/n", lineno_int);
}
运行结果如下:
cherry@ubuntu:~$ gcc test.c -o test
cherry@ubuntu:~$ ./test
lineno_str : 123
lineno_int : 123
2. 在文件指定行的末尾添加信息
找到某一行还是很容易的,但是在文件中进行插入比较麻烦,本来以为找到指定行直接在末尾添加就可以了,结果悲剧的发现后面的东西被替换了,惆怅。google了下发现文件的内容在缓冲区中是按字节顺序操作的,所以修改文件内容是顺序操作,在某位置修改时会把原始存放在该位置的内容给替换掉,而不是在文件的当前位置插入你修改的内容。
无奈只好走了一条曲折的路线,逐行读取原文件,如不是待修改行则直接拷贝到新建的一个临时文件,如是待修改行则进行修改后再拷贝过去,然后将原来的文件删除,将临时文件重命名为原来的文件。由于要修改好几行,来来回回反反复复还真是麻烦,谁有更好的方法记得告诉我啊。
由于这段代码比较长,就不贴出来了占篇幅了,只附一段逐行读取文件的吧,虽然这块是从网上找来然后修改的,嘿嘿。
#include
#include
#define LINE 1024
char *ReadData(FILE *fp, char *buf)
{
return fgets(buf, LINE, fp);
}
void main()
{
FILE *fp;
char *buf,*p;
if ((fp=fopen("bpinfo","r"))==NULL)
{
printf("Cannot open file!/n");
exit(0);
}
buf = (char *)malloc(LINE*sizeof(char));
p = ReadData(fp, buf); //将每行的内容读到buf中
while (p)
{
DoSomething(buf, strlen(buf)); //对该行的任意操作
p = ReadData(fp, buf); //指针移到下一行
}
fclose(fp);
}
(2010年8月31日)