请教: 如何去掉每行结尾的换行符? C .

UIUI 2019-05-22 12:28:26

/* 标准文档模板 */

#include "Stdio.h"
#include "Conio.h"
#include <sys\stat.h>
#include <time.h>
#include "ctype.h"
#include "stdlib.h"
//#include <windows.h>
//#include "StdAfx.h"
int main()
{
FILE *fpSS;
FILE *fpDS;
int err;
char *str;
char *temp;
system("color 17");

str=(char*)malloc(sizeof(char));
temp=(char*)malloc(sizeof(char));
err=fopen_s(&fpSS,"filess.txt","r");
err=fopen_s(&fpDS,"fileds.txt","w");
if(fpDS==NULL)
{
puts("-fileds.txt- 文件打开错误!!\n");
exit(-1);
}
if(fpSS==NULL)
{
puts("-filess.Txt- 文件打开错误\n");
fputs("源文件打开错误!",fpDS);
exit(-1);
}


while ( fgets(str,100+1,fpSS) != NULL )
{
puts(str); //在这里如何用temp 变换一下,再写入文件?
fputs(str,fpDS);


}
fclose(fpSS);
fclose(fpDS);
getch();
return(0);
}
...全文
604 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
六道佩恩 2019-05-29
  • 打赏
  • 举报
回复
引用 9 楼 UIUI 的回复:
//修改版. To 赵4老师: 程序不能编译程序 VS2019 程序还没看懂.收藏再消化. To 六道佩恩: 查看网上的方法,有不少是用一个字符一个字符读的方法. 我试试后,再用你列举的两个方法.


/* 标准文档模板 */

#include "Stdio.h"
#include "Conio.h"
#include <sys\stat.h> 
#include <time.h>
#include "ctype.h"
#include "stdlib.h"
#include "string.h"


char* NopEnter(char* str)  // 此处代码是抄的,  但是比较 好懂.
{
	char* p;
	if ((p = strchr(str, '\n')) != NULL)
		* p = '\0';
	return str;
}

int main()
{
	FILE* fpSS;
	FILE* fpDS;
	int err;
	char* str;
	char* temp;
	system("color 17");

	str = (char*)malloc(sizeof(char)*101);
	temp = (char*)malloc(sizeof(char)*101);
	err = fopen_s(&fpSS, "filess.txt", "r");
	err = fopen_s(&fpDS, "fileds.txt", "w");
	if (fpDS == NULL)
	{
		puts("-fileds.txt- 文件打开错误!!\n");
		exit(-1);
	}
	if (fpSS == NULL)
	{
		puts("-filess.Txt- 文件打开错误\n");
		fputs("源文件打开错误!", fpDS);
		exit(-1);
	}


	while (fgets(str, 100, fpSS) != NULL)
	{
		puts(str);   
		str = NopEnter(str);  //去掉回车
		fputs(str, fpDS);


	}
	fclose(fpSS);
	fclose(fpDS);
	return(0);
}

这个方法也挺好的,跟fwrite的那个方法应该差不多,fgets应该就是以换行为结尾获取的一行字符,那么换行应该就在结尾。
赵4老师 2019-05-22
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
FILE *f;
int c1,c2;
int main(int argc,char *argv[]) {
    if (argc!=2) {
        printf("Usage: CR2CRLF filename\n");
        return 1;
    }
    f=fopen(argv[1],"rb+");
    if (NULL==f) {
        printf("Can not open file [%s]!\n",argv[1]);
        return 2;
    }
    while (1) {
        c1=fgetc(f);
        if (EOF==c1) break;
        if ('\r'==c1) {
            c2=fgetc(f);
            if (EOF==c2) {
                fseek(f,-1L,SEEK_CUR);
                fputc('\n',f);
                break;
            }
            if ('\n'!=c2) {
                fseek(f,-2L,SEEK_CUR);
                fputc('\n',f);
                fseek(f,1,SEEK_CUR);
            }
        }
    }
    fclose(f);
    return 0;
}
jiamianshiye 2019-05-22
  • 打赏
  • 举报
回复


  str=(char*)malloc(sizeof(char));
  temp=(char*)malloc(sizeof(char));

你这里分配一个字节空间,然后下列代码中一次读一行最长101字节。 你不怕越界访问内存??你这段代码写的问题很大。

 while (  fgets(str,100+1,fpSS) != NULL )
     {
        puts(str);    //在这里如何用temp 变换一下,再写入文件?
        fputs(str,fpDS);

     }
UIUI 2019-05-22
  • 打赏
  • 举报
回复
//修改版. To 赵4老师: 程序不能编译程序 VS2019 程序还没看懂.收藏再消化. To 六道佩恩: 查看网上的方法,有不少是用一个字符一个字符读的方法. 我试试后,再用你列举的两个方法.


/* 标准文档模板 */

#include "Stdio.h"
#include "Conio.h"
#include <sys\stat.h> 
#include <time.h>
#include "ctype.h"
#include "stdlib.h"
#include "string.h"


char* NopEnter(char* str)  // 此处代码是抄的,  但是比较 好懂.
{
	char* p;
	if ((p = strchr(str, '\n')) != NULL)
		* p = '\0';
	return str;
}

int main()
{
	FILE* fpSS;
	FILE* fpDS;
	int err;
	char* str;
	char* temp;
	system("color 17");

	str = (char*)malloc(sizeof(char)*101);
	temp = (char*)malloc(sizeof(char)*101);
	err = fopen_s(&fpSS, "filess.txt", "r");
	err = fopen_s(&fpDS, "fileds.txt", "w");
	if (fpDS == NULL)
	{
		puts("-fileds.txt- 文件打开错误!!\n");
		exit(-1);
	}
	if (fpSS == NULL)
	{
		puts("-filess.Txt- 文件打开错误\n");
		fputs("源文件打开错误!", fpDS);
		exit(-1);
	}


	while (fgets(str, 100, fpSS) != NULL)
	{
		puts(str);   
		str = NopEnter(str);  //去掉回车
		fputs(str, fpDS);


	}
	fclose(fpSS);
	fclose(fpDS);
	return(0);
}

  • 打赏
  • 举报
回复
引用 3 楼 lin5161678的回复:
  str=(char*)malloc(sizeof(char));
  temp=(char*)malloc(sizeof(char));
你好像完全不知道这2句代码是干嘛的?
空间分配啊 ,
lin5161678 2019-05-22
  • 打赏
  • 举报
回复
  str=(char*)malloc(sizeof(char));
  temp=(char*)malloc(sizeof(char));
你好像完全不知道这2句代码是干嘛的?
UIUI 2019-05-22
  • 打赏
  • 举报
回复
引用 1 楼 이 몽 결的回复:
去掉\n?。。。。。。,,,,
我也不知道是n还是r
  • 打赏
  • 举报
回复
去掉\n?。。。。。。,,,,
UIUI 2019-05-22
  • 打赏
  • 举报
回复
引用 3 楼 lin5161678的回复:
  str=(char*)malloc(sizeof(char));
  temp=(char*)malloc(sizeof(char));
你好像完全不知道这2句代码是干嘛的?
知道,却用错了。应该是*100
六道佩恩 2019-05-22
  • 打赏
  • 举报
回复
你可以不用fputs, 方法一:改用fputc,循环单个字符输出到文件,遇到换行不输出 方法二:用fwrite,检测字符串的长度,然后写这个长度-1个字符(换行在最后的话)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧