int read(FILE *fp)//读文件,并返回行数 { int row=0; char mid; while(!feof(fp)) { mid=fgetc(fp); //从txt文本中读取一个字符赋值给mid if(mid=='\n') //如果这个字符为换行符 row++; //记录txt数据行数 } row++; //最后一行没有换行符 rewind(fp); //回文件起始位置 return(row); } 以上代码我应该添加什么使得row不统计空行?
时间: 2024-04-11 08:26:09 浏览: 12
要使`row`不统计空行,你可以在判断换行符后加上一个条件来排除空行。修改后的代码如下所示:
```c
int read(FILE *fp) // 读文件,并返回行数
{
int row = 0;
char mid;
while (!feof(fp))
{
mid = fgetc(fp); // 从txt文本中读取一个字符赋值给mid
if (mid == '\n' && row > 0) // 如果这个字符为换行符且不是第一行(空行)
row++; // 记录txt数据行数
}
row++; // 最后一行没有换行符
rewind(fp); // 回文件起始位置
return row;
}
```
这样修改后,只有当`row`大于0时才会将其递增,从而排除了第一行为空的情况。
相关问题
int ReadNode(int& N) //从文件读出结构体数组的内容,如成功读取返回TRUE,否则返回ERROR { FILE* fp; int i = 0; if ((fp = fopen("question", "rb")) == NULL) return ERROR; while (!feof(fp)) // 用feof检测文件是否结束,如果结束,返回正确 { fread(&Testquestions[i], sizeof(TestNode), 1, fp); i++; } N = i - 1; return TRUE; }
这段代码是用来从文件中读取结构体数组的内容,其中Testquestions是一个TestNode类型的结构体数组,N是传入的参数,用来返回成功读取的结构体数组的数量。这段代码首先打开名为“question”的二进制文件,然后使用while循环和feof函数来读取文件中的内容,每次从文件中读取一个TestNode类型的结构体,并将其存储在Testquestions数组中。最后,将成功读取的结构体数组的数量减1赋给N,并返回TRUE表示读取成功,返回ERROR表示读取失败。
代码为什么不能正常运行:#include<stdio.h> #include<stdlib.h> #include<string.h> # define MAX 100 FILE * fp;//文件指针 void write(char bt[MAX]){ char nr; FILE * fp1; fp1=fopen(bt,"a"); //本地文件查找"max+.txt"文件,以追加方式打开 for(int i=0; i<MAX; i++) { int j=0;//"="个数 if( nr=='=') j++; // else j=0; fread(&nr,1,1,fp);//一次读一个字符 进字符数组 fwrite(&nr,1,1,fp1); //读一个,写一个 if(j==9){ fclose(fp1); break; //连续10个"=",跳出循环 } } } void read(void) { FILE * fp1; char bt[MAX];//临时 标题 for(int i=0; i<MAX;i++){ if( bt[i-1]=='-'&& bt[i]=='\0') //判断是否读完标题 { bt[i-1]='.';bt[i]=bt[i+2]='t';bt[i+1]='x'; write(bt); } fread(&bt[i],sizeof(char),1,fp);//一次读一个字符 进字符数组 } } int main(void){ char filename[]="My Clippings.txt"; if((fp=fopen(filename,"r"))==NULL) //以只读方式,查看能否打开文件 { printf("can not open the files\n"); system("pause"); return 0; } do { read() ; }while(fp != NULL ); fclose(fp);//关闭文件My Clippings.txt return 0; }
在你的代码中,有几个问题需要注意一下:
1. 在 `read()` 函数中,你需要在每次循环前检查是否已经到达文件末尾,可以使用 `feof(fp)` 函数来判断。
2. 在 `write()` 函数中,你用了一个未初始化的变量 `nr`,应该先给它赋一个初值。
3. 在 `write()` 函数中,你将打开的文件指针命名为 `fp1`,但是在写文件时却使用了未初始化的 `fp` 指针。
4. 在 `main()` 函数中,你的文件读取循环条件错误,应该是 `while(!feof(fp))`。
下面是修改后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
FILE *fp; //文件指针
void write(char bt[MAX])
{
char nr = '\0'; //初始化为 0
FILE *fp1;
fp1 = fopen(bt, "a"); //本地文件查找"max+.txt"文件,以追加方式打开
for (int i = 0; i < MAX; i++)
{
int j = 0; //"="个数
if (nr == '=')
j++;
else
j = 0;
fread(&nr, 1, 1, fp); //一次读一个字符 进字符数组
fwrite(&nr, 1, 1, fp1); //读一个,写一个
if (j == 9)
{
fclose(fp1);
break; //连续10个"=",跳出循环
}
}
}
void read(void)
{
char bt[MAX] = {0}; //临时 标题
for (int i = 0; i < MAX; i++)
{
if (feof(fp)) //到达文件末尾
{
fclose(fp);
fp = NULL;
break;
}
fread(&bt[i], sizeof(char), 1, fp); //一次读一个字符 进字符数组
if (bt[i - 1] == '-' && bt[i] == '\0') //判断是否读完标题
{
bt[i - 1] = '.';
bt[i] = bt[i + 2] = 't';
bt[i + 1] = 'x';
write(bt);
}
}
}
int main(void)
{
char filename[] = "My Clippings.txt";
if ((fp = fopen(filename, "r")) == NULL) //以只读方式,查看能否打开文件
{
printf("can not open the files\n");
system("pause");
return 0;
}
do
{
read();
} while (fp != NULL);
return 0;
}
```