标题:“七夕” 闲来无事,为了进一步掌握理解字符串数组,做了一件比较无聊的事情 ...
只看楼主
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
结帖率:99.76%
已结贴  问题点数:100 回复次数:29 
“七夕” 闲来无事,为了进一步掌握理解字符串数组,做了一件比较无聊的事情,把一个文本文件以行为单位传导到一个数组里,然后再把这个数组输出<欢迎各种批判&g
程序代码:
#include <stdio.h>
#include <windows.h>

int main()
{
    HANDLE hFile = CreateFile(TEXT("d:\\test.txt"),GENERIC_READ,0,NULL,OPEN_EXISTING ,
                              FILE_ATTRIBUTE_NORMAL,NULL);                                           
    if (hFile == INVALID_HANDLE_VALUE)
    {
        OutputDebugString(TEXT("CreateFile fail!\r\n"));
    }
    char *p[10000];    //分配文本文件的行数,暂定最多接收10000行
    for(int i=0;i<10000;i++)
    {
        p[i]= (char*)malloc(256);   //每行最多接收256个字符
        memset(p[i],0,256);
    }
    DWORD filesize=GetFileSize(hFile,NULL);
    char* buffer=new char[filesize+1];                   
    memset(buffer,0,filesize+1);
    DWORD readsize;
    ReadFile(hFile,buffer,filesize,&readsize,NULL);
    int k,j=0,n=0;
    for(k=0;k<(int)filesize;k++)
    {
        if(buffer[k]!='\n')    //按行扫描
        {
            *(p[j]+n)=buffer[k];    //效率啊  每次仅copy一个字符
            n++;     // n 是干啥的  n是移动个体字符串索引(相当于指针)
        }
        else
        {
            j++;    //j 代表的行数
            n=0;
        }
    }
    //输出字符串指针数组
    int m=0;
    while(m<10000)
    {
        if(*p[m]=='\0') break;
        printf("%s\n",p[m]);
        m++;
    }
    delete buffer;
    return 0;
}
搜索更多相关主题的帖子: 文本文件 字符串 七夕 
2013-08-13 15:36
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
因为创建文件  读取文件部分是copy自网上的代码
所以c语法和c++语法 都混在一起了

DO IT YOURSELF !
2013-08-13 15:37
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:12 
没法看

总有那身价贱的人给作业贴回复完整的代码
2013-08-13 15:40
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用embed_xuel在2013-8-13 15:40:18的发言:

没法看
   咋的呢  排版不好 风格不好 还是其他

DO IT YOURSELF !
2013-08-13 15:42
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:12 
纯用C的库函数就好了 fopen神马的
2013-08-13 15:46
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用zklhp在2013-8-13 15:46:34的发言:

纯用C的库函数就好了 fopen神马的
最初确实这样做的 ,可我对c的fopen fread fseek 系类函数不熟  用不太明白  后来又改掉的了

DO IT YOURSELF !
2013-08-13 15:48
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:0 
回复 4楼 wp231957
不说,反正说啥你都会说写着玩的,别太较真

总有那身价贱的人给作业贴回复完整的代码
2013-08-13 15:50
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用embed_xuel在2013-8-13 15:50:32的发言:

不说,反正说啥你都会说写着玩的,别太较真
   我的一个朋友的观点始终在影响着我,
   不管黑猫白猫 能实现目标 就是好猫
   ps: 你说的对极了,我还真是写着玩

DO IT YOURSELF !
2013-08-13 15:54
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
会者不难  难者不会

这段代码  我反复调试了N++次 才成功
程序代码:
 for(k=0;k<(int)filesize;k++)
    {
        if(buffer[k]!='\n')    //按行扫描
        {
            *(p[j]+n)=buffer[k];    //效率啊  每次仅copy一个字符
            n++;     // n 是干啥的  n是移动个体字符串索引(相当于指针)
        }
        else
        {
            j++;    //j 代表的行数
            n=0;
        }
    }



DO IT YOURSELF !
2013-08-13 15:56
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:12 
1. 为什么要用系统APIs,而不是C/C++标准库?
2. 如果文件打开失败,除了向 Output windows 输出错误提示信息还应该 return 吧
3. "p[i]= (char*)malloc(256);   //每行最多接收256个字符" --- 应该是255个字符吧
4. 我唯一想批评的只有一点,就是无赖的memset
5. windows文本的行间隔符其实是“\r\n”
6. 上面说了最多接受10000行,每行最多接受255个字符,但代码中却没作限制,会溢出的
7. *(p[j]+n) 不如 p[j][n] 清晰
8. 只有malloc,没有free
9. new[]分配的,只能用delete[]释放,不管是不是内建型别,不要听那些半瓶子水的家伙瞎扯。
2013-08-13 16:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-419023-1-1.html




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

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