鱼C论坛

 找回密码
 立即注册
查看: 3317|回复: 3

C语言改写文件数据

[复制链接]
发表于 2019-9-28 09:39:43 | 显示全部楼层 |阅读模式

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

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

x
比如我有这么一个txt文件
第一个aa
第二个bb 1.000
第三个cc  2.000 3.000 4.000
我要修改第二行最后的数据,每次用用一个随机数代替,请问怎么写代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-28 12:04:35 | 显示全部楼层
本帖最后由 jackz007 于 2019-9-28 12:05 编辑

        文本文件是通过回车符来界定和划分单元的,这样,就导致每个记录的字节长度参差不齐,这就决定了无论用什么语言,文本文件都是顺序文件,一般都无法直接定位修改文件内容,必须事先另外创建一个文件,逐行读取旧文件的内容,进行必要的修改过后,再逐行写入新的文件,最后,根据需要决定是否删除旧文件,重命名新文件。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-28 16:26:33 | 显示全部楼层
我手动生成一个副本后,应该如何修改文本里的内容呢,主要是因为每行长度不同。我在读取第二行字符串时第一行的后半部分内容还在
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-29 00:48:31 | 显示全部楼层
本帖最后由 jackz007 于 2019-9-29 02:06 编辑
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void)
  4. {
  5.         char s1[260] , s2[256][16]                                                                   ;
  6.         FILE * fp1 , * fp2                                                                           ;
  7.         float f                                                                                      ;
  8.         int c , d , k , m                                                                            ;
  9.         if((fp1 = fopen("data1.dat" , "r")) != NULL) {
  10.                 if((fp2 = fopen("data2.dat" , "w")) != NULL) {
  11.                         fgets(s1 , 256 , fp1)                                                        ; // 读取文件第 1 行内容
  12.                         c = 0                                                                        ; // 文件行号初始化为 0
  13.                         while(! feof(fp1)) {                                                           // 循环读取文件内容,直到文件结束
  14.                                 k = m = 0                                                            ;
  15.                                 s1[strlen(s1) - 1] = '\0'                                            ; // 去掉行末的回车符
  16.                                 c ++                                                                 ; // 文件行号加 1
  17.                                 while(k < strlen(s1)) {
  18.                                         d = 0                                                        ;                              
  19.                                         while(k < strlen(s1) && s1[k] == ' ') k ++                   ; // 越过第 m 项后面的空格
  20.                                         while(k < strlen(s1) && s1[k] != ' ') s2[m][d ++] = s1[k ++] ; // 复制第 m 项内容
  21.                                         s2[m][d] = '\0'                                              ; // 第 m 项字符串末尾添加结束标志                                   
  22.                                         m ++                                                         ;
  23.                                 }
  24.                                 for(k = 0 ; k < m ; k ++) {                                            // 生成输出文件行内容,m 代表本行的项数
  25.                                         if(! k) {
  26.                                                 strcpy(s1 , s2[0])                                   ;
  27.                                         } else {
  28.                                                 strcat(s1 , " ")                                     ;
  29.                                                 sscanf(s2[k] , "%f" , & f)                           ;
  30.                                                 sprintf(& s1[strlen(s1)] , "%.3f" , f + k)           ; // 每一项的值等于原来的值 + 本项的序号
  31.                                         }
  32.                                 }        
  33.                                 fprintf(fp2 , "%s\n" , s1)                                           ; // 把新行写入文件
  34.                                 fgets(s1 , 256 , fp1)                                                ; // 新读取 1 行文件内容
  35.                         }
  36.                         fclose(fp2)                                                                  ;        
  37.                 }
  38.                 fclose(fp1)                                                                          ;
  39.         }
  40. }
复制代码


data1.dat
  1. aa
  2. bb 1.000
  3. cc 2.000 3.000 4.000
复制代码


data2.dat
  1. aa
  2. bb 2.000
  3. cc 3.000 5.000 7.000
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 23:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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