C++ 二进制写入文件怎么加换行符?

C++ 二进制写入文件怎么加换行符?,第1张

C++如果用C++的文件流, 用的是endl(end of line)
如果用C语言的文件输出函数, 则还是\n
当然, 用C++的文件流也可以写\n, 但是要和字符串写在一起

      行内超网系统在自动化测试工具时碰到一个有意思的问题,在windows系统上运行自动化测试工具的智能发起端去模拟人行发送xml报文,智能发起端读取报文时,如果xml报文中含有换行 *** 作,超网系统处理发起端发送的报文失败,后来跟超网系统的人沟通,了解到超网系统在读取报文时会把首次出现\r\n之后的报文截取先来当做xml去处理。但是通过日志中打印的报文发现\r\n变成了\n,由此导致处理出错。

    思考问题出现的原因时觉得可能出现问题的地方有:

1读取数据时替换了\r\n为\n。

2数据在读取后java处理出问题

3数据写出时出的问题。

决定debug跟踪一下数据流转过程,查看到底是哪里的问题。发现发起端读取报文时把\r\n替换为\n,这个时候一度陷入了一个思维误区,一直觉得报文里的\r\n就是换行的意思,这时发现在不同系统下换行是有不同的表示的,但是超网系统需要判断的仅仅是\r\n(在window是回车换行,在unix下是^M),而不是换行这个 *** 作符

我的思维误区就是把\r\n这个实际的bit数抽象成计算机换行这个 *** 作,而不同的计算机系统换行具有不同的表达方式。因此只有把\t\n当做计算机中实际的值去 *** 作,java中是把\r\n抽象成换行去处理,因此需要去特殊处理

Window上换行符是\r \n,unix上换行符\n,os系统使用\r

你把流换成
FileOutputStream fos=new FileOutputStream(String FilePath);
PrintWriter pw=new PrintWriter(fos);
pwwriter(JtextareaClassjtextarea1getText() );
试试
我写了一个,试了没问题,解决办法就是对JtextArea添加键盘监听,当按下enter键时自动添加一个换行符\r,全部代码如下:
package test;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaawteventKeyEvent;
import javaawteventKeyListener;
import javaioFileOutputStream;
import javaxswingJButton;
import javaxswingJFrame;
import javaxswingJPanel;
import javaxswingJTextArea;
public class Test implements ActionListener,KeyListener{
JTextArea jta;

/
空参构造方法
/
public Test() {
JFrame jf=new JFrame("Test");
JPanel jp=new JPanel();
jta=new JTextArea(10,20);
jtaaddKeyListener(this);//添加键盘监听
JButton b=new JButton("输出");
baddActionListener(this);

jpadd(jta);
jpadd(b);
jfadd(jp);

jfpack();
jfsetVisible(true);
jfsetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
try {
FileOutputStream fos=new FileOutputStream("D:/1txt");
foswrite(jtagetText()getBytes());
fosclose();
} catch (Exception e1) {
e1printStackTrace();
}

}
/
键盘按下时执行
/
@Override
public void keyPressed(KeyEvent e) {
//当按下Enter键时,插入一个换行符(Enter键的keycode为10)
if(egetKeyCode()==10){
jtaappend("\r");
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}

/
main方法
@param args
/
public static void main(String[] args) {
new Test();
}
}

在文本模式下向文本中写入换行可以直接只用'\n',在Window下会自动转换为'\r''\n';
在binary模式下写入换行,Window下由于是使用\r\n来标识结尾,所以需要写入'\r''\n'两个字符,Linux只需要写入'\n' 。

1、C语言标准库提供了一系列文件 *** 作函数。文件 *** 作函数一般以f+单词的形式来命名(f是file的简写),其声明位于stdioh头文件当中。例如:fopen、fclose函数用于文件打开与关闭;fscanf、fgets函数用于文件读取;fprintf、fputs函数用于文件写入;ftell、fseek函数用于文件 *** 作位置的获取与设置。
2、例程:

#include<stdioh>
int a;
char b,c[100];
int main(){
    FILE  fp1 = fopen("inputtxt", "r");//打开输入文件
    FILE  fp2 = fopen("outputtxt", "w");//打开输出文件
    if (fp1==NULL || fp2==NULL) {//若打开文件失败则退出
        puts("不能打开文件!");
        return 0;
    }
    fscanf(fp1,"%d",&a);//从输入文件读取一个整数
    b=fgetc(fp1);//从输入文件读取一个字符
    fgets(c,100,fp1);//从输入文件读取一行字符串
    
    printf("%ld",ftell(fp1));//输出fp1指针当前位置相对于文件首的偏移字节数
    
    fputs(c,fp2);//向输出文件写入一行字符串
    fputc(b,fp2);//向输出文件写入一个字符
    fprintf(fp2,"%d",a);//向输出文件写入一个整数
    
    fclose(fp1);//关闭输入文件
    fclose(fp2);//关闭输出文件,相当于保存
    return 0;
}

1 输出空行到文件,另一网友已回答 echo>>文件名,其中还可以换为;\等,至于在哪里加,在本批处理的两次call之间插入或在第一个批处理结尾或第二个开始时加都行
2 当call 另一批处理或子过程时,可以改另一批处理(或子过程)中的输出重定义到文件,还可以在主导批处理中
call 某批处理>>文件名
或call :子过程>>文件名
3 建议,当需要反复书写某字符串时,宜把它定义为一变量便于核对和修改如
set "filename=C:\Users\Administrator\Desktop\temptxt"
if exist "%filename%" del "%filename%"
4 >是覆盖式重定向,第一次输出到文件时用>代>> 完全可以省去那删除某文件的语句


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12785735.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-28
下一篇 2023-05-28

发表评论

登录后才能评论

评论列表(0条)

保存