作者deo2000 (800IM)
看板CodeJob
标题Re: [讨论] 修改CSV格式 请问这样值多少钱?
时间Fri Dec 2 18:43:02 2011
感谢板上各方高手出来献计,又让小弟我回去重新检视 code 发现严重 Bug!
假设有效资料 6000 笔,若 user 输入 5000 笔,会回过头把前 1000 笔资料盖
掉!幸好发现得早,不然就吃了人家的饭,又耽误人家毕业时程了!
很高兴无心上来问个小问题,就能引出这麽多高手互相切磋。虽然我只得懂
C++ 和 VB6,不过其他的语言我还是尝试去解读,竟然看到有一行就能完成的实
在太强...@@
不过看到 reader 说的 "要把 user 当笨蛋,写一个好的小程式" 我就有感
而发。为了要写得防呆、防错、快速 (考虑哪里要 break 或 inline , 或是怎麽
减少 loop 又不会出错) 花的时间,远大於写到有最低功能的时间。尤其这个版
很多靠程式过生活,不像我只是卖卖人情,怎麽写的细致就很重要,但是在业主
costdown 的风气下,各位会不会怀疑,自己需不需要这麽用心呢?
因我们只修 3 学分程式设计,不像资工资管学了一大堆,计结、资结、演算
法都是程式设计「顺便讲一下」而已,命名原则、防错、加速的观念老师上课会提
,但是不要求。不讳言的说,自己写到满足功能就花了三小时,後面又花了好几倍
的时间改良和除错,而且还没除完...@@,看来我若要上战场,真的还得多修几门
资工的课。
我也来贴一下修改後的 code 好了:
(缩排都是一个 Tab,请问po上来的时候要怎麽修改才不会太长呢?)
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <ctype.h>
using namespace std;
#define Number 200000 //有效资料笔数上限,可修改
#define Word 6 //每次读入资料字元上限,可修改
FILE *cfPtr;
char strWord[Word]; //暂存读入的一笔资料
int nCounter=0; // 资料笔数计数器
int nNonDig=0; // "非半形数字"计数器
double daArr[Number]; //剔除"非半形数字"後,储存在此
int main(void)
{
while(1) //选单系统
{
cout << " 这是OOO专用客制化程式,其他人用也要请我吃鸡排XD by OOO
\n\n" ;
cout << " 1.清除 \"input.txt\" 中所有的非半形数字字元,需与本.exe放同资料夹
\n";
cout << " 2.把每组数字呈直行排列\n";
cout << " 3.最多读入 20 万组数据\n";
cout << " 4.每组数据不可超过六字元(中文3字元)\n";
cout << " 5.目前只接受整数,还无法接受浮点数\n";
cout << " 6.会输出 \"修改完成.txt\" \n\n";
break;
}
if( (cfPtr = fopen("input.txt","r")) == NULL)
cout << " 找不到档案";
else
{
while(!feof(cfPtr))
{
fscanf(cfPtr,"%s",&strWord); //读一笔资料,以ASCII储存
for(int i=0;i<Word;i++) //开始检查此笔数据中,是否有非数字
if((strWord[i]<48 ||
57<strWord[i])&&(strWord[i]!='\0')/*&&(strWord[i]!=46)*/) // 判断,字串strWord
中是否有不属於数字的ASCII
{
nNonDig++; //有非数字就在nNonDig纪录
break;
}
if(nNonDig==0)
{
daArr[nCounter] = atoi(strWord); //atoi()可把ASCII转回
nCounter++;
}
else if(nNonDig!=0)
nNonDig=0; //归零,否则後面每个loop每笔都变非数字
}
fclose(cfPtr);
} //读取完成
if(nCounter!=0)/* 开始写入档案 */
{
cfPtr = fopen("修改完成.txt","w");
cout << "有效资料共 " << nCounter << " 笔!" << endl;
for(int i=0;i<nCounter;i++)
fprintf(cfPtr,"%.0lf\n",daArr[i]); //把阵列daArr[i]每个元素逐行印出,去除小
数(反正都是0)
}
fclose(cfPtr);
cout << "\n\a ";
system("pause");
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.224.52.205
1F:推 qmo668:我觉得这个讨论串超有趣XDDDD 12/02 23:23
2F:推 ripeSelf:作业怎麽可以拿来收钱,做做人情刚刚好.......... 12/03 01:31
3F:推 kirk76:看这几篇好开心 05/12 01:03