| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 793 人关注过本帖
标题:文件读取行的问题,求指导
只看楼主 加入收藏
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 9楼 TonyDeng
if(line[strlen(line)-1] == '{')                 /**  如果读到的行最后一个位是否‘{’           */ 我这个表达对还是错阿。
2012-03-01 13:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
理論上對,但實際的文本中,一行最後的'{'字符後面可能有若干空格(假設不考慮注釋),此時就可能漏掉這個符號。首先需要做的事,是設計一個可操作的流程,是確保能夠正確完成任務的,然後按這個流程寫程序(所謂“程序”,就是流程)。比如,你可以先把line後面的空格全部過濾掉,再執行這個判斷。這些東西,才是要你自己想的。

又比如,不要依賴用空格(ASCII 32)來判斷什麼,有些文本可能用了'\t'。這些,都要靠仔細的測試和調試才能發現的。程序員要耐得住寂寞,指的就是這種現實調試,假定一切都有嚴格格式,程序當然好寫了,但現實不是這樣。

授人以渔,不授人以鱼。
2012-03-01 13:33
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 12楼 TonyDeng
程序代码:
#include <stdio.h>
#include <string.h>

main()
{
  char line[1024];
  int  ident = 0;
  char *p;
  int  i;
  int  k = 0;
  FILE *fip = fopen("a.c", "r");
  FILE *fop = fopen("a.tmp", "w");
  char j[] = {0x20};
  fgets(line, 1024, fip);
  while(!ferror(fip)&& !feof(fip)){
    while(line[k++] == ' ')
      p = line+(k-1);
    for (i=0; i<ident; i++){
      fwrite(j, 1, sizeof(char), fop);
    }
    if(line[strlen(p)-1] == '{'){
      ++ident;
      ++ident;
    }
    if(line[strlen(p)-1] == '}'){
      --ident;
      --ident;
    }
    i = 0;
    fgets(line, 1024, fip);
  }
  fclose(fip);
  fclose(fop);
}


哪里错了。为什么运行没效果
2012-03-01 13:42
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 12楼 TonyDeng
继续想
2012-03-01 13:42
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 12楼 TonyDeng
程序代码:
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000000

main()
{
  char line[MAXLINE];
  int  indent = 0;
  char *p;
  int  i;
  int  k = 0;
  FILE *fip = fopen("a.c", "r");
  FILE *fop = fopen("a.tmp", "w");
  char j[] = {0x20};
  fgets(line, MAXLINE, fip);
  while(!ferror(fip)&& !feof(fip)){
    if(line[strlen(line)-1] == '{'){
      ++indent;
      ++indent;
    }
    if(line[strlen(line)-1] == '}'){
      --indent;
      --indent;
    }
    while(line[k++] == ' ')
      p = line+(k-1);
    for (i=0; i<indent; i++){
      fwrite(j, 1, sizeof(char), fop);
    }
    fputs(p, fop);
    i = 0;
    fgets(line, 1024, fip);
  }
  fclose(fip);
  fclose(fop);
  system("move a.c a.bak");
  system("move a.tmp a.c");
}

为什么不行呢
2012-03-01 14:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你不妨這樣做,從line的最後開始往回溯,凡是空格或製表符之類(如果要考慮全角空格或更古怪的字符,都可以補上去),都馬上改成'\0',直到遇到不是這些東西的字符為止,如果這個時候,還不是'{'或'}',那麼該行就不需處理了。

你寫程序的時候,最好先寫一個測試文件,就一行,寫上(黏貼也行)一些常見的程序代碼,看自己的程序能不能處理好,能處理了,再往下做,測試一個完整程序代碼的文件。慢慢弄吧,整理文本數據,是往後很常見的活。大數運算十年都遇不到一次,但這種東西,每月遇到的機會比女人來親戚的次數還多。

還有,寫程序要習慣拆分函數,不要一氣呵成。寫個函數,傳入一行,處理好,返回。一行弄好了,整個文本也就好了。再弄點測試手段,printf()出傳入和返回的字符串,看看效果如何,直到徹底滿意了,這個函數就算好了,然後再寫下面的對整個文本循環。

你自己練習吧,正如P版說的,給你代碼反而害了你。


[ 本帖最后由 TonyDeng 于 2012-3-1 14:24 编辑 ]

授人以渔,不授人以鱼。
2012-03-01 14:17
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 16楼 TonyDeng
我纠结阿fgets只能读一行。不能读全文本阿。
2012-03-01 15:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
当然是循环使用fgets()的了

授人以渔,不授人以鱼。
2012-03-02 14:31
快速回复:文件读取行的问题,求指导
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018421 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved