Goal:我在Visual Studio2022中使用C语言将位于C:/Users/13383/Desktop/storage.txt的文件中"STORAGE_"之后的序列号减少7252.storage.txt中的数据如下图所示:

...

"STORAGE_7253":
...
"STORAGE_7254":
...
"STORAGE_7255":
...

Already done:我的节目如下所示:

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

#define MAX_LINE_LENGTH 1000

int main() {
    FILE* fp;
    char line[MAX_LINE_LENGTH];
    char* pos;
    int num;

    if (fopen_s(&fp, "C:/Users/13383/Desktop/storage.txt", "r+") != 0) {
        printf("Error opening file\n");
        exit(1);
    }

    while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) {
        pos = strstr(line, "STORAGE_");
        if (pos != NULL) {
            num = atoi(pos + strlen("STORAGE_"));
            printf("%d\n", num);
            num -= 7252;
            sprintf_s(pos + strlen("STORAGE_"), MAX_LINE_LENGTH - (pos - line) - strlen("STORAGE_"), "%d\"", num);
            puts(line);
        }
        //fputs(line, fp);
    }

    fclose(fp);
    printf("Done!\n");
    return 0;
}

Problem:当我注释掉fputs(line, fp);时,我发现变量"line"的内容是正确的:

terminal picture

但是当我取消注释"fputs"以在document中写入字符串时,它提示一个错误:

enter image description here

所以我想知道问题出在哪里,以及如何解决它?

推荐答案

最佳修复:

只读打开"storage.txt"文件-我们将其命名为ifile

打开"new.storage.txt"文件进行输出-我们将其命名为ofile

从IFILE进入读取循环

Read line from ifile
Process line
Write line to ofile

关闭文件

关闭文件

如果新的ofile创建成功,则将ifile重命名为"yyyyMMddhhmmss.storage.txt"(其中"yyyyMMddhhmmss"表示日期时间)

将文件重命名为"storage.txt"

最好始终以非 destruct 性的方式更新文件,因此编写一个新文件,然后重命名旧文件和重命名新文件是谨慎的方法.如果在文件I/O操作过程中出现问题,没有伤害,没有错误.

C++相关问答推荐

如何将匿名VLA分配给指针?

CC crate 示例不会与C函数链接

C中的ATONE会扰乱SEN/CLUTE GMS应用程序中的其他字符串

ATTiny1606定时器TCA 0中断未触发

如何解决C中的严格别名?

核心转储文件中出现奇怪的大小变化

减法运算结果的平方的最快方法?

当输入负数时,排序算法存在问题

文件权限为0666,但即使以超级用户身份也无法打开

如果dim指定数组中的数据量,使用dim-1会不会潜在地导致丢失一个元素?

如何使用[BTStack]BLE发送大型(>;2kb)信息包

Sizeof(&Q;字符串&Q;)的正确输出是什么?

如何在下面的C代码中正确管理内存?

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

生成的头文件不包括用户定义的文件

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?

当 a 是代码块时使用逗号运算符 (a, b)