鱼C论坛

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

C语言改写文件数据

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

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

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

x
比如我有这么一个txt文件
第一个aa
第二个bb 1.000
第三个cc  2.000 3.000 4.000
我要修改第二行最后的数据,每次用用一个随机数代替,请问怎么写代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

int main(void)
{
        char s1[260] , s2[256][16]                                                                   ;
        FILE * fp1 , * fp2                                                                           ;
        float f                                                                                      ;
        int c , d , k , m                                                                            ;
        if((fp1 = fopen("data1.dat" , "r")) != NULL) {
                if((fp2 = fopen("data2.dat" , "w")) != NULL) {
                        fgets(s1 , 256 , fp1)                                                        ; // 读取文件第 1 行内容
                        c = 0                                                                        ; // 文件行号初始化为 0 
                        while(! feof(fp1)) {                                                           // 循环读取文件内容,直到文件结束
                                k = m = 0                                                            ;
                                s1[strlen(s1) - 1] = '\0'                                            ; // 去掉行末的回车符
                                c ++                                                                 ; // 文件行号加 1
                                while(k < strlen(s1)) {
                                        d = 0                                                        ;                               
                                        while(k < strlen(s1) && s1[k] == ' ') k ++                   ; // 越过第 m 项后面的空格
                                        while(k < strlen(s1) && s1[k] != ' ') s2[m][d ++] = s1[k ++] ; // 复制第 m 项内容
                                        s2[m][d] = '\0'                                              ; // 第 m 项字符串末尾添加结束标志                                   
                                        m ++                                                         ;
                                }
                                for(k = 0 ; k < m ; k ++) {                                            // 生成输出文件行内容,m 代表本行的项数 
                                        if(! k) {
                                                strcpy(s1 , s2[0])                                   ;
                                        } else {
                                                strcat(s1 , " ")                                     ;
                                                sscanf(s2[k] , "%f" , & f)                           ;
                                                sprintf(& s1[strlen(s1)] , "%.3f" , f + k)           ; // 每一项的值等于原来的值 + 本项的序号
                                        }
                                }        
                                fprintf(fp2 , "%s\n" , s1)                                           ; // 把新行写入文件
                                fgets(s1 , 256 , fp1)                                                ; // 新读取 1 行文件内容
                        }
                        fclose(fp2)                                                                  ;        
                }
                fclose(fp1)                                                                          ;
        }
}

data1.dat
aa
bb 1.000
cc 2.000 3.000 4.000

data2.dat
aa
bb 2.000
cc 3.000 5.000 7.000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 15:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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