鱼C论坛

 找回密码
 立即注册
查看: 1290|回复: 6

fputc输出到文件内容,与printf输出到屏幕不一样的问题

[复制链接]
发表于 2022-2-19 11:04:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

主要问题点:
  1. ch =(char)tmp ;
  2. printf("%c",ch);
  3. fputc(ch,file4);
复制代码

输出是这样的,也是我想要的
  1. heroname:后羿
  2. heroid:1
  3. heroAtk:1000
  4. herophy:200
  5. herotype:射手
  6. 请输入你要查询的内容(退出查询请输入2):
复制代码

但是写入文件以后是这样的
  1. heroname:后羿

  2. heroid:1

  3. heroAtk:1000

  4. herophy:200

  5. herotype:射手

复制代码

多了好几个换行



求助求助,感谢感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-2-19 12:14:30 | 显示全部楼层
发完整代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-19 14:56:00 | 显示全部楼层
  1. char ch=0;
  2.           srand(time(NULL));
  3.           FILE *file3 =fopen("加密文件.txt","w+");
  4.         while(1)
  5.         {
  6.                 ch=fgetc(file2);
  7.                
  8.                 if(!feof(file2))
  9.                 {
  10.                         short tmp = (short)ch;
  11.                         tmp = tmp << 4;
  12.                 //        printf("%d\n",tmp);
  13.                         tmp = tmp | 0x8000 ;
  14.                 //        printf("%d\n",tmp);
  15.                         tmp = tmp + rand()%16;
  16.                 //        printf("%d\n",tmp);
  17.                         fprintf(file3,"%hd",tmp);
  18.                 }
  19.                 else
  20.                 break;
  21.         }
  22.         fclose(file3);
  23.         file3 = NULL;
  24.        
  25.         //---------------------------------------------------------------------
  26.         //文件解密
  27. //        1000 0100 1100 0110  << 1
  28. //        0000 1001 1000 1100         >> 5
  29. //        0000 0000 0100 1100
  30.        
  31.         file3 = fopen("加密文件.txt","r");
  32.         if(!file3)
  33.         {
  34.                 perror("");
  35.                 return -1;
  36.         }
  37.         FILE *file4 = fopen("解密文件.txt","w+");
  38.         if(!file4)
  39.         {
  40.                 perror("");
  41.                 return -1;
  42.         }
  43.         while(!feof(file3))
  44.         {
  45.                 short tmp;
  46.                 fscanf(file3,"%hd",&tmp);
  47.                         tmp = tmp << 1;
  48.                         tmp = tmp >> 5;       
  49.                         ch =(char)tmp ;
  50.                         printf("%c",ch);
  51.                         fputc(ch,file4);
  52.         }
  53.         fclose(file4);
  54.         file4 = NULL;
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-19 17:30:32 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-23 08:58:07 | 显示全部楼层


这里问题在 写入文件的内容每一行都多了一个换行



  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>

  5. //CR:Carriage Return,对应ASCII中转义字符\r,表示回车
  6. //
  7. //LF:Linefeed,对应ASCII中转义字符\n,表示换行
  8. //
  9. //CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行
  10. //
  11. //众所周知,
  12. //
  13. //Windows操作系统采用两个字符来进行换行,即CRLF;
  14. //
  15. //Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;
  16. //
  17. //另外,MacIntosh操作系统(即早期的Mac操作系统)采用单个字符CR来进行换行。
  18. int main()
  19. {
  20.         FILE *file1 = fopen("原文件.txt","rb");
  21.         FILE *file2 = fopen("新文件.txt","wb+");
  22.         if(!file1||!file2)
  23.         {
  24.                 perror("");
  25.                 return -1;
  26.         }
  27.        
  28.         char buf[1024] ="";
  29.         while(fgets(buf,sizeof(buf),file1)!=NULL)        //获取有效信息
  30.         {
  31.                 //printf("[%s]\n",buf);        // 打印显示乱码 ,将txt文本编码改成 ANSI
  32.                 for(int i=0;buf[i]!='\0';i++)
  33.                 {
  34.                        
  35.                          if(buf[i]==':')//将有效信息存入 新文件
  36.                         {
  37.                         //fputs()可以指定输出的文件流,不会输出多余的字符;puts()只能向 stdout 输出字符串,而且会在最后自动增加换行符。
  38.                                 int n=fputs(buf,file2);       
  39.                                
  40.                         }       
  41.                 }
  42.          }
  43.         //        fflush 强行将缓冲中的数据同步到硬盘上去
  44.         //fflush(file2);
  45.         //        fclose 文件关闭前,会自动将缓冲中数据同步到硬盘
  46.           fclose(file2);
  47.           file2 = NULL;       
  48.           file2 = fopen("新文件.txt","rb");
  49.           if(!file2)
  50.         {
  51.                 perror("");
  52.                 return -1;
  53.         }
  54.           // 文件加密
  55. //          0000 0000 0100 1100        << 4
  56. //          0000 0100 1100 0000   | 1000 0000 0000 0000  将数字全置为负数
  57. //          1000 0100 1100 0000        + 0000~1111(0-15)
  58. //          1000 0100 1100 0110
  59.           
  60.           char ch=0;
  61.           srand(time(NULL));
  62.           FILE *file3 =fopen("加密文件.txt","w+");
  63.         while(1)
  64.         {
  65.                 ch=fgetc(file2);
  66.                
  67.                 if(!feof(file2))
  68.                 {
  69.                         short tmp = (short)ch;
  70.                         tmp = tmp << 4;
  71.                 //        printf("%d\n",tmp);
  72.                         tmp = tmp | 0x8000 ;
  73.                 //        printf("%d\n",tmp);
  74.                         tmp = tmp + rand()%16;
  75.                 //        printf("%d\n",tmp);
  76.                         fprintf(file3,"%hd",tmp);
  77.                 }
  78.                 else
  79.                 break;
  80.         }
  81.         fclose(file3);
  82.         file3 = NULL;
  83.        
  84.         //---------------------------------------------------------------------
  85.         //文件解密
  86. //        1000 0100 1100 0110  << 1
  87. //        0000 1001 1000 1100         >> 5
  88. //        0000 0000 0100 1100
  89.        
  90.         file3 = fopen("加密文件.txt","r");
  91.         if(!file3)
  92.         {
  93.                 perror("");
  94.                 return -1;
  95.         }
  96.         FILE *file4 = fopen("解密文件.txt","w");
  97.         if(!file4)
  98.         {
  99.                 perror("");
  100.                 return -1;
  101.         }
  102.         while(!feof(file3))
  103.         {
  104.                 short tmp;
  105.                 fscanf(file3,"%hd",&tmp);
  106.                         tmp = tmp << 1;
  107.                         tmp = tmp >> 5;       
  108.                         ch =(char)tmp ;
  109.                         printf("%c",ch);
  110.                         fputc(ch,file4);
  111.         }
  112.         fclose(file4);
  113.         file4 = NULL;
  114.         //--------------------------------------------------------------------------
  115.         //        查询信息
  116.         char newbuf[1024]=" ";
  117.         while(1)
  118.         {
  119.                 printf("请输入你要查询的内容(退出查询请输入2):");
  120.                 fgets(newbuf,sizeof(newbuf),stdin);
  121.                 newbuf[strlen(newbuf)-1]='\0';
  122.         //        printf("[%s]",newbuf);
  123.                 int i=1;
  124.                 fseek(file2,0,SEEK_SET);
  125.                 if(newbuf[0]=='2')
  126.                 {
  127.                         break;
  128.                 }         
  129.                 while(fgets(buf,sizeof(buf),file2)!=NULL)
  130.                 {
  131.                
  132.                         if(!strncmp(newbuf,buf,strlen(newbuf)))
  133.                         {
  134.                                 i=0;
  135.                                 printf("%s",(char *)buf+strlen(newbuf)+1);
  136.                                 break;
  137.                         }
  138.                 }
  139.                 if(i)
  140.                 printf("抱歉,未查询到!\n");
  141.         }
  142.         fclose(file1);
  143.         fclose(file2);
  144.         system("pause");
  145.         return 0;
  146. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-23 12:05:22 | 显示全部楼层
想入门的新人 发表于 2022-2-23 08:58
这里问题在 写入文件的内容每一行都多了一个换行
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>

  5. // CR:Carriage Return,对应ASCII中转义字符\r,表示回车
  6. // LF:Linefeed,对应ASCII中转义字符\n,表示换行
  7. // CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行
  8. // 众所周知,
  9. // Windows操作系统采用两个字符来进行换行,即CRLF;
  10. // Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;
  11. // 另外,MacIntosh操作系统(即早期的Mac操作系统)采用单个字符CR来进行换行。

  12. int main() {
  13.     FILE *file1 = fopen("原文件.txt", "rb");
  14.     FILE *file2 = fopen("新文件.txt", "wb+");
  15.     if(!file1 || !file2) {
  16.         perror("");
  17.         return -1;
  18.     }

  19.     //char buf[1024] = "";
  20.     char buf[1024];     // 不需要初始化吧?
  21.     while(fgets(buf, sizeof(buf), file1) != NULL) //获取有效信息
  22.     {
  23.         // printf("[%s]\n",buf);        // 打印显示乱码 ,将txt文本编码改成 ANSI
  24.         for(int i = 0; buf[i] != '\0'; i++) {
  25.             if(buf[i] == ':') //将有效信息存入 新文件
  26.             {
  27.                 // fputs()可以指定输出的文件流,不会输出多余的字符;puts()只能向
  28.                 // stdout 输出字符串,而且会在最后自动增加换行符。
  29.                 //int n = fputs(buf, file2);    // 这是在做什么?
  30.             }
  31.         }
  32.     }
  33.     //        fflush 强行将缓冲中的数据同步到硬盘上去
  34.     // fflush(file2);
  35.     //        fclose 文件关闭前,会自动将缓冲中数据同步到硬盘
  36.     fclose(file2);

  37.     // 下面的代码没法看了,因为没看懂上面的代码,上面的代码在做什么?
  38.     // 把代码删减一下,突出你的问题


  39.     //file2 = NULL;
  40.     file2 = fopen("新文件.txt", "rb");
  41.     if(!file2) {
  42.         perror("");
  43.         return -1;
  44.     }
  45.     // 文件加密
  46.     //          0000 0000 0100 1100        << 4
  47.     //          0000 0100 1100 0000   | 1000 0000 0000 0000  将数字全置为负数
  48.     //          1000 0100 1100 0000        + 0000~1111(0-15)
  49.     //          1000 0100 1100 0110

  50.     char ch = 0;
  51.     srand(time(NULL));
  52.     FILE *file3 = fopen("加密文件.txt", "w+");
  53.     while(1) {
  54.         ch = fgetc(file2);

  55.         if(!feof(file2)) {
  56.             short tmp = (short)ch;
  57.             tmp = tmp << 4;
  58.             //        printf("%d\n",tmp);
  59.             tmp = tmp | 0x8000;
  60.             //        printf("%d\n",tmp);
  61.             tmp = tmp + rand() % 16;
  62.             //        printf("%d\n",tmp);
  63.             fprintf(file3, "%hd", tmp);
  64.         } else
  65.             break;
  66.     }
  67.     fclose(file3);
  68.     file3 = NULL;

  69.     //---------------------------------------------------------------------
  70.     //文件解密
  71.     //        1000 0100 1100 0110  << 1
  72.     //        0000 1001 1000 1100         >> 5
  73.     //        0000 0000 0100 1100

  74.     file3 = fopen("加密文件.txt", "r");
  75.     if(!file3) {
  76.         perror("");
  77.         return -1;
  78.     }
  79.     FILE *file4 = fopen("解密文件.txt", "w");
  80.     if(!file4) {
  81.         perror("");
  82.         return -1;
  83.     }
  84.     while(!feof(file3)) {
  85.         short tmp;
  86.         fscanf(file3, "%hd", &tmp);
  87.         tmp = tmp << 1;
  88.         tmp = tmp >> 5;
  89.         ch = (char)tmp;
  90.         printf("%c", ch);
  91.         fputc(ch, file4);
  92.     }
  93.     fclose(file4);
  94.     file4 = NULL;
  95.     //--------------------------------------------------------------------------
  96.     //        查询信息
  97.     char newbuf[1024] = " ";
  98.     while(1) {
  99.         printf("请输入你要查询的内容(退出查询请输入2):");
  100.         fgets(newbuf, sizeof(newbuf), stdin);
  101.         newbuf[strlen(newbuf) - 1] = '\0';
  102.         //        printf("[%s]",newbuf);
  103.         int i = 1;
  104.         fseek(file2, 0, SEEK_SET);
  105.         if(newbuf[0] == '2') {
  106.             break;
  107.         }
  108.         while(fgets(buf, sizeof(buf), file2) != NULL) {
  109.             if(!strncmp(newbuf, buf, strlen(newbuf))) {
  110.                 i = 0;
  111.                 printf("%s", (char *)buf + strlen(newbuf) + 1);
  112.                 break;
  113.             }
  114.         }
  115.         if(i) printf("抱歉,未查询到!\n");
  116.     }
  117.     fclose(file1);
  118.     fclose(file2);
  119.     //system("pause");      // 不是所有编译环境都能用这个
  120.     return 0;
  121. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-23 13:44:16 | 显示全部楼层


                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图


原文件经过加密解密后多了几行换行
我使用的是DEV c++这个软件 system(“pause”);这个可以用没问题
感谢帮助,感谢感谢

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>

  5. int main()
  6. {
  7.         FILE *file1 = fopen("原文件.txt","rb");
  8.         FILE *file2 = fopen("新文件.txt","wb+");
  9.         if(!file1||!file2)
  10.         {
  11.                 perror("");
  12.                 return -1;
  13.         }
  14.        
  15.         char buf[1024] ="";
  16.         while(fgets(buf,sizeof(buf),file1)!=NULL)        //获取有效信息
  17.         {
  18.                 for(int i=0;buf[i]!='\0';i++)
  19.                 {       
  20.                          if(buf[i]==':')//将有效信息存入 新文件
  21.                         {
  22.                                 int n=fputs(buf,file2);               
  23.                         }       
  24.                 }
  25.          }
  26.           fclose(file2);
  27.           file2 = NULL;       
  28.           file2 = fopen("新文件.txt","rb");
  29.           if(!file2)
  30.         {
  31.                 perror("");
  32.                 return -1;
  33.         }
  34.           // 文件加密
  35. //          0000 0000 0100 1100        << 4
  36. //          0000 0100 1100 0000   | 1000 0000 0000 0000  将数字全置为负数
  37. //          1000 0100 1100 0000        + 0000~1111(0-15)
  38. //          1000 0100 1100 0110
  39.           
  40.           char ch=0;
  41.           srand(time(NULL));
  42.           FILE *file3 =fopen("加密文件.txt","w+");
  43.         while(1)
  44.         {
  45.                 ch=fgetc(file2);
  46.                
  47.                 if(!feof(file2))
  48.                 {
  49.                         short tmp = (short)ch;
  50.                         tmp = tmp << 4;
  51.        
  52.                         tmp = tmp | 0x8000 ;
  53.        
  54.                         tmp = tmp + rand()%16;
  55.        
  56.                         fprintf(file3,"%hd",tmp);
  57.                 }
  58.                 else
  59.                 break;
  60.         }
  61.         fclose(file3);
  62.         file3 = NULL;
  63.        
  64.         //---------------------------------------------------------------------
  65.         //文件解密
  66. //        1000 0100 1100 0110  << 1
  67. //        0000 1001 1000 1100         >> 5
  68. //        0000 0000 0100 1100
  69.        
  70.         file3 = fopen("加密文件.txt","r");
  71.         if(!file3)
  72.         {
  73.                 perror("");
  74.                 return -1;
  75.         }
  76.         FILE *file4 = fopen("解密文件.txt","w");
  77.         if(!file4)
  78.         {
  79.                 perror("");
  80.                 return -1;
  81.         }
  82.         while(!feof(file3))
  83.         {
  84.                 short tmp;
  85.                 fscanf(file3,"%hd",&tmp);
  86.                         tmp = tmp << 1;
  87.                         tmp = tmp >> 5;       
  88.                         ch =(char)tmp ;
  89.                         printf("%c",ch);
  90.                         fputc(ch,file4);
  91.         }
  92.         fclose(file4);
  93.         file4 = NULL;

  94.         fclose(file1);
  95.         fclose(file2);
  96.         system("pause");
  97.         return 0;
  98. }
复制代码




小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 02:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表