[新人求助] 文本太长 使用fgets(),fputs()不能完整地将文本内容打印出来.只打印了一部分.

账号作废 2017-04-01 04:28:52
[新人求助] 文本太长 使用fgets(),fputs()不能完整地将文本内容打印出来.只打印了一部分.

我复制了政府工作报告,非常长.
http://www.yjbys.com/gongwuyuan/show-532844.html
打印出来的内容不完整,缺少一部分.
如果换成比较短的文章可以完整的打印出来.
百度和谷歌没搜到这种情况啊.
[quote]
#include<stdio.h>
#include<stdlib.h>
int main ( )
{
const char* file_name = "E:/test.txt";
FILE* fp;

if ( ( fp = fopen ( file_name , "r" ) ) == NULL )
{
printf ( "不能打开 %s\n" , file_name );
exit ( EXIT_FAILURE );
}
else
{
printf ( "成功打开 %s\n" , file_name );
}

char str [ 20 ];
while ( fgets ( str , 20 , fp ) != NULL )
{
fputs ( str , stdout );
}

fclose ( fp );
}
...全文
290 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-04-02
  • 打赏
  • 举报
回复
我贴的这段代码有处理超长行的逻辑。 cmd窗口显示不下太多内容请参考下面: 使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定 向到不同的位置。输入或输出数据流的位置即为句柄。 下表将列出可用的句柄。 句柄 句柄的数字代号 描述 STDIN 0 键盘输入 STDOUT 1 输出到命令提示符窗口 STDERR 2 错误输出到命令提示符窗口 UNDEFINED 3-9 这些句柄由应用程序单独定义,并且是各个工具特定的。 数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个 句柄中的任何一个重定向。要指定想使用的句柄,可在重定向操作符前面键入该句柄的 数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出 操作符是 1。键入 > 或 < 操作符之后,必须指定要读取或写入数据的位置。可以指定 文件名或另一个现有的句柄。 要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号 (例如 &句柄#)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到 句柄 1(即 STDOUT): 2>&1 下表列出了可用于将输入和输出数据流进行重定向的操作符。 重定向操作符 描述 > 将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口或句柄中。 < 从文件中而不是从键盘或句柄中读入命令输入。 >> 将命令输出添加到文件末尾而不删除文件中的信息。 >& 将一个句柄的输出写入到另一个句柄的输入中。 <& 从一个句柄读取输入并将其写入到另一个句柄输出中。 | 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。 默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。 重定向输入 (<) 要将键盘输入重定向到文件或设备,请使用 < 操作符。例如,要从 File.txt 获取 sort 命令的输入,请键入: sort<file.txt File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。 < 操作符可以打开具有只读访问的指定文件名。所以,不能使用该操作符向文件中写入 信息。例如,如果以 <&2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句 柄 2 最初是以只写访问打开的。 注意 0 是 < 重定向输入操作符的默认句柄。 重定向输出 (>) 几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的 命令也会在命令提示符窗口显示消息和提示。 要将输出从命令提示符窗口重定向到文件或设备,请使用 > 操作符。可以在许多命令中 使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入: dir>dirlist.txt 如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。 要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入: netsh routing dump>c:\route.cfg > 操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。 例如,如果使用重定向 >&0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为 句柄 0 最初是以只读访问打开的。 注意 1 是 > 重定向输出操作符的默认句柄。 复制句柄 重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如, 要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入: dir>c:\file.txt 2>&1 复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只写访问的 属性,则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄 复制到另一个具有只写访问属性的句柄。 使用 & 操作符重定向输入和副本 要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用,指定的文件必须已经存在。 如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中包含的字符作为 输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄 复制到系统现有的句柄中。 例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入: <file.txt 要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入: sort<file.txt 要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入: findfile file.txt>search.txt 2<&1 要以句柄 0 输入读取(即 STDIN)的方式复制用户定义句柄 3,请键入: <&3 使用 & 操作符重定向输出和复制 如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆 盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。 要将用户定义句柄 3 复制到句柄 1,请键入: >&3 要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到 句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入: ipconfig.exe>>output.log 2>&1 使用 >> 重定向操作符追加输出 要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续 的大于号(即 >>)。例如,下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件: dir>>dirlist.txt 要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾,请键入: netstat>>tcpinfo.txt 使用管道操作符 (|) 管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另 一个命令的输入中(默认情况下是 STDIN)。例如,下面的命令将对目录分类: dir | sort 在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令 的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到 句柄 1(即 STDOUT)。 合并带重定向操作符的命令 可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如,可以使用以 下命令存储包含“LOG”字符串的文件名: dir /b | find "LOG" > loglist.txt dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名 列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。 要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将 搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名,并且在命令提示符窗口中 每次显示一屏: dir c:\ /s /b | find "LOG" | more 利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。 find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择 的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅 使用筛选器。
账号作废 2017-04-01
  • 打赏
  • 举报
回复
引用 3 楼 qq_31989333 的回复:
不知道哪位朋友可以实际的试验一下我的代码呢. test.txt文件里面复制这个链接里面(全部复制)http://www.yjbys.com/gongwuyuan/show-532844.html
复制这个链接里面的 政府工作报告(全部复制) 粘贴到test.txt
账号作废 2017-04-01
  • 打赏
  • 举报
回复
不知道哪位朋友可以实际的试验一下我的代码呢. test.txt文件里面复制这个链接里面(全部复制)http://www.yjbys.com/gongwuyuan/show-532844.html
账号作废 2017-04-01
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int i,z;
int b,n,L;
int main(int argc,char **argv) {
    if (argc<2) {
        printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);
        return 1;
    }
    f=fopen(argv[1],"r");
    if (NULL==f) {
        printf("Can not open file [%s]!\n",argv[1]);
        return 2;
    }
    z=0;
    b=0;
    n=0;
    L=0;
    while (1) {
        if (NULL==fgets(ln,MAXLEN,f)) break;
        L=strlen(ln);
        if ('\n'==ln[L-1]) {
            if (0==z) {
                for (i=0;i<L-1;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L-1) z=1;//当前行不是空行
            }
            if (0==z) b++; else n++;
            z=0;
        } else {
            if (0==z) {
                for (i=0;i<L;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L) z=1;//当前行不是空行
            }
        }
    }
    fclose(f);
    if (L>0 && '\n'!=ln[L-1]) {
        if (0==z) b++; else n++;//最后一行末尾无'\n'也计算
    }
    printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);
    return 0;
}
菜鸟真心看不懂啊.太复杂了. 还是感谢赵老师.
赵4老师 2017-04-01
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int i,z;
int b,n,L;
int main(int argc,char **argv) {
    if (argc<2) {
        printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);
        return 1;
    }
    f=fopen(argv[1],"r");
    if (NULL==f) {
        printf("Can not open file [%s]!\n",argv[1]);
        return 2;
    }
    z=0;
    b=0;
    n=0;
    L=0;
    while (1) {
        if (NULL==fgets(ln,MAXLEN,f)) break;
        L=strlen(ln);
        if ('\n'==ln[L-1]) {
            if (0==z) {
                for (i=0;i<L-1;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L-1) z=1;//当前行不是空行
            }
            if (0==z) b++; else n++;
            z=0;
        } else {
            if (0==z) {
                for (i=0;i<L;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L) z=1;//当前行不是空行
            }
        }
    }
    fclose(f);
    if (L>0 && '\n'!=ln[L-1]) {
        if (0==z) b++; else n++;//最后一行末尾无'\n'也计算
    }
    printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);
    return 0;
}

69,512

社区成员

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

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