whb123 发表于 2019-9-28 09:39:43

C语言改写文件数据

比如我有这么一个txt文件
第一个aa
第二个bb 1.000
第三个cc2.000 3.000 4.000
我要修改第二行最后的数据,每次用用一个随机数代替,请问怎么写代码

jackz007 发表于 2019-9-28 12:04:35

本帖最后由 jackz007 于 2019-9-28 12:05 编辑

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

whb123 发表于 2019-9-28 16:26:33

我手动生成一个副本后,应该如何修改文本里的内容呢,主要是因为每行长度不同。我在读取第二行字符串时第一行的后半部分内容还在

jackz007 发表于 2019-9-29 00:48:31

本帖最后由 jackz007 于 2019-9-29 02:06 编辑

#include <stdio.h>
#include <string.h>

int main(void)
{
      char s1 , s2                                                                   ;
      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 = '\0'                                          ; // 去掉行末的回车符
                              c ++                                                               ; // 文件行号加 1
                              while(k < strlen(s1)) {
                                        d = 0                                                      ;                              
                                        while(k < strlen(s1) && s1 == ' ') k ++                   ; // 越过第 m 项后面的空格
                                        while(k < strlen(s1) && s1 != ' ') s2 = s1 ; // 复制第 m 项内容
                                        s2 = '\0'                                              ; // 第 m 项字符串末尾添加结束标志                                 
                                        m ++                                                         ;
                              }
                              for(k = 0 ; k < m ; k ++) {                                          // 生成输出文件行内容,m 代表本行的项数
                                        if(! k) {
                                                strcpy(s1 , s2)                                 ;
                                        } else {
                                                strcat(s1 , " ")                                     ;
                                                sscanf(s2 , "%f" , & f)                           ;
                                                sprintf(& 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
页: [1]
查看完整版本: C语言改写文件数据