C语言实现:文件不存在写入NULL,存在写入书名等内容的问题
解决文件存在/不存在时的差异化写入问题
嘿,我看了你写的代码和需求,发现几个关键问题需要调整,咱们一步步来解决:
首先明确你的核心需求:
当
shelf.txt不存在时,写入字符串NULL;文件存在时,写入书名等内容而非NULL
原代码的几个问题
- 缺失文件存在时的处理逻辑:你的代码只写了文件不存在的分支,完全没处理文件存在的情况,这是最核心的缺失
- 写入冗余垃圾数据:你用
fwrite(start, sizeof(char), MAX, shelfFile)写入整个30字节的数组,但"NULL"只有4个字符,数组剩下的26字节都是未初始化的垃圾值,会被一起写入文件 - 未完成的文件关闭:代码最后
fclos...明显没写完,正确的应该是fclose(shelfFile),而且要确保每次打开文件后都能正确关闭 - 缺少错误检查:没有判断
fopen是否成功,万一因为权限、路径问题打不开文件,程序会直接崩溃
修正后的解决方案(跨平台版)
这个方案用标准C的fopen判断文件是否存在,不需要额外的平台特定头文件,兼容性更好:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 30 int main() { FILE *shelfFile; // 示例书名,你可以换成自己需要写入的内容 char bookInfo[MAX] = "《C语言入门经典》 | 作者:XXX"; const char *nullStr = "NULL"; int fileExists = 0; // 第一步:判断文件是否存在——尝试以只读模式打开 shelfFile = fopen("shelf.txt", "r"); if (shelfFile) { // 能打开说明文件存在,标记后先关闭只读句柄 fileExists = 1; fclose(shelfFile); } // 第二步:根据文件是否存在,选择打开模式和写入内容 if (fileExists) { // 文件存在,用"w"模式覆盖写入(如果要追加内容就用"a") shelfFile = fopen("shelf.txt", "w"); if (!shelfFile) { perror("Failed to open existing file"); return 1; } printf("File exists, writing book info...\n"); // 只写入实际的字符串长度,避免垃圾数据 fwrite(bookInfo, sizeof(char), strlen(bookInfo), shelfFile); } else { // 文件不存在,创建并写入NULL shelfFile = fopen("shelf.txt", "w"); if (!shelfFile) { perror("Failed to create new file"); return 1; } printf("File not found, writing NULL...\n"); fwrite(nullStr, sizeof(char), strlen(nullStr), shelfFile); } // 统一写入换行符,保证文件格式整齐 fwrite("\n", sizeof(char), 1, shelfFile); // 最后一定要关闭文件,释放资源 if (shelfFile) { fclose(shelfFile); } return 0; }
关键细节说明
- 判断文件存在的方式:用
fopen("r")尝试打开,能打开则说明文件存在,这种方式是标准C支持的,跨Windows、Linux、Mac都能用 - 写入字符串的正确姿势:用
strlen()获取字符串的实际长度,而不是数组的最大长度,这样就不会写入未初始化的垃圾数据 - 文件打开模式:
"w":会清空原文件内容后写入,适合需要覆盖更新的场景"a":会在文件末尾追加内容,适合需要保留原内容的场景,根据你的需求选择即可
- 错误处理:每次
fopen后都检查返回值,用perror()打印错误信息,方便调试
另一种方案(POSIX平台专用)
如果你只在Linux/Mac等POSIX系统上运行,可以用access函数直接检查文件是否存在,代码更简洁:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> // 注意:这个头文件是POSIX专用的,Windows下需要用<io.h>和_access #define MAX 30 int main() { FILE *shelfFile; char bookInfo[MAX] = "《C语言入门经典》 | 作者:XXX"; const char *nullStr = "NULL"; // 用access函数直接检查文件是否存在 if (access("shelf.txt", F_OK) == -1) { // 文件不存在 shelfFile = fopen("shelf.txt", "w"); if (!shelfFile) { perror("Create file failed"); return 1; } printf("Writing NULL to new file...\n"); fwrite(nullStr, sizeof(char), strlen(nullStr), shelfFile); } else { // 文件存在 shelfFile = fopen("shelf.txt", "w"); if (!shelfFile) { perror("Open file failed"); return 1; } printf("Writing book info to existing file...\n"); fwrite(bookInfo, sizeof(char), strlen(bookInfo), shelfFile); } fwrite("\n", sizeof(char), 1, shelfFile); fclose(shelfFile); return 0; }
内容的提问来源于stack exchange,提问作者codergirrl
相关产品推荐
相关产品推荐

