这段代码有何问题int FindLinesInCSV(FILE* Fp) { fseek(Fp, 0, 0);//将文件指针重新指向文件开头 char ch[1024] = {0};//缓冲区域 int nLine = 0; if (SuccessfulOpen(Fp)) { cout << "wrong path !" << endl; return 0; } else { while (fgets(ch,1024,Fp) != NULL) {//每次在缓冲区域中输入一行数据 nLine++; } } return (nLine); }
时间: 2024-01-04 16:03:02 浏览: 28
这段代码存在以下问题:
1. 变量`nLine`未被初始化:在函数开始时,应该将变量`nLine`初始化为0。
2. `SuccessfulOpen`函数未定义:应该先定义或包含该函数。
3. `fseek`函数调用不必要:在函数调用之前,文件指针默认已经指向文件开头。
4. `fgets`函数调用不安全:当读取到的数据长度大于缓冲区大小时,可能会导致缓冲区溢出。应该使用`fgets(ch, sizeof(ch), Fp)`,其中`sizeof(ch)`返回缓冲区大小。
改进后的代码如下:
```c++
int FindLinesInCSV(FILE* Fp) {
char ch[1024] = {0}; // 缓冲区域
int nLine = 0;
while (fgets(ch, sizeof(ch), Fp) != NULL) { // 每次在缓冲区域中输入一行数据
nLine++;
}
return nLine;
}
```
相关问题
int SearchCitiesSerialNumber(char* Temp, CITIES* pCity, FILE* Fp) { fseek(Fp, 0, 0);//将文件指针重新指向文件开头 int nLine = FindLinesInCSV(Fp);//得到文件中共有几行数据 for (int i = 0; i < nLine; i++) { if (!strcmp(pCity[i].cCity, Temp))return i; } return -1; }
这段代码的功能是在城市数组中搜索指定城市名并返回其在数组中的序号。具体来说,该函数首先使用 FindLinesInCSV() 函数获取城市数组中的元素个数,然后使用 for 循环遍历整个数组,逐一比较每个元素的城市名是否与指定的城市名相同。如果找到了匹配的城市名,则返回该城市在数组中的序号。如果遍历完整个数组后仍未找到匹配的城市名,则返回 -1。需要注意的是,该函数还包含了一些错误处理代码,例如在文件打开失败时返回 -1。
#include<stdio.h> //全局变量的定义 unsigned short int res[10]; //储存加密后的数据,一个unsigned short int占两个字节 unsigned short int temp; //临时储存非加密数据 int length; //储存原文件长度 int i=0; void encrypto() { FILE *fp1=fopen("1.bmp","rb"); //这里可以改为用户输入路径文件,本程序为了便捷就固定了文件名 if(fp1!=NULL) { for(i=0;i<10;i++){ fread(&res[i],sizeof(unsigned short int),1,fp1); //从原文件种读取20个字节 res[i]^=123; //将读取出的数据与用户输入的密钥做异或,粉碎文件头 } //这里为了方便起见假设用户加密口令为123 //获取BMP原文件长度 fseek(fp1,0,2); //使文件光标退到文件结尾 length=ftell(fp1); //放回文件长度 fclose(fp1); FILE *fp2=fopen("2.bmp","wb"); //这里也可以改为用户输入的路径 fp1=fopen("1.bmp","rb"); if(fp2!=NULL) { for(i=0;i<10;i++){ fwrite(&res[i],sizeof(unsigned short int),1,fp2);//将异或后的数据存储在新文件中 } fseek(fp1,20,0); //将原文件的文件指针向后移动20个字节 while(i<length/2) //循环将fp1的非加密数据写入fp2中 { fread(&temp,sizeof(unsigned short int),1,fp1); fwrite(&temp,sizeof(unsigned short int),1,fp2); i++; } fclose(fp1); fclose(fp2); printf("加密成功!请牢记您的加密口令\n"); }else{ printf("保存加密文件失败!\n"); } }else{ printf("打开文件失败!\n"); } }这段代码有什么错,怎么改正
这段代码实现了bmp图片的加密功能。从代码的角度来看,没有明显的语法错误或逻辑错误,但是有一些需要注意的地方:
1. 加密后的文件名和原文件名相同,这样会覆盖原文件,建议加密后的文件名与原文件名不同。
2. 加密后的文件中只包含了原文件最后一半的数据,原文件前一半的数据没有被加密,建议将原文件的全部数据都加密。
改正方法如下:
1. 修改加密后的文件名,例如将加密后的文件名改为"enc_1.bmp"。
2. 将原文件的全部数据都加密,即将`fseek(fp1,20,0)`改为`fseek(fp1,0,0)`,这样就可以将原文件的所有数据都读取并加密。
修改后的代码如下:
```
#include <stdio.h>
unsigned short int res[10]; // 储存加密后的数据,一个 unsigned short int 占两个字节
unsigned short int temp; // 临时储存非加密数据
int length; // 储存原文件长度
int i = 0;
void encrypto() {
FILE *fp1 = fopen("1.bmp", "rb"); // 这里可以改为用户输入路径文件,本程序为了便捷就固定了文件名
if (fp1 != NULL) {
for (i = 0; i < 10; i++) {
fread(&res[i], sizeof(unsigned short int), 1, fp1); // 从原文件种读取20个字节
res[i] ^= 123; // 将读取出的数据与用户输入的密钥做异或,粉碎文件头
}
// 这里为了方便起见假设用户加密口令为123
// 获取 BMP 原文件长度
fseek(fp1, 0, SEEK_END); // 移动到文件结尾位置
length = ftell(fp1); // 获取文件长度
fseek(fp1, 0, SEEK_SET); // 移动到文件开始位置
fclose(fp1);
FILE *fp2 = fopen("enc_1.bmp", "wb"); // 这里也可以改为用户输入的路径
fp1 = fopen("1.bmp", "rb");
if (fp2 != NULL) {
for (i = 0; i < 10; i++) {
fwrite(&res[i], sizeof(unsigned short int), 1, fp2); // 将异或后的数据存储在新文件中
}
while (i < length / 2) { // 循环将 fp1 的非加密数据写入 fp2 中
fread(&temp, sizeof(unsigned short int), 1, fp1);
temp ^= 123; // 将非加密数据与用户输入的密钥做异或,保证数据的一致性
fwrite(&temp, sizeof(unsigned short int), 1, fp2);
i++;
}
fclose(fp1);
fclose(fp2);
printf("加密成功!请牢记您的加密口令\n");
} else {
printf("保存加密文件失败!\n");
}
} else {
printf("打开文件失败!\n");
}
}
```
此处修改后的代码只是解决了两个问题,其他问题需要具体情况具体分析。