2 回答
TA贡献1780条经验 获得超1个赞
我的 Java 有点生疏,但看起来你写入文件的内容是三个 4 字节整数,按顺序和机器字节顺序(所以可能是小端序)。这意味着您的文件应该具有(十六进制):
9a 00 00 00 62 00 00 00 06 00 00 00
但是您的扫描预计会将数字视为以空格分隔的文本,例如(以十六进制表示)
31 35 34 20 39 38 20 36 0a
你可能应该使用类似的东西fread()
,它不做解析:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
并且目标应该是类似的地址int[3]
。
TA贡献1852条经验 获得超1个赞
我知道fscanf读取一个字符流,然后根据给定的格式对其进行解析。这意味着我们应该以 C 支持的字符格式用 Java 编写文件。
这就是我所做的:
Java代码:
package scratchpad;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.logging.Level;
import java.util.logging.Logger;
public class WriteClass {
void writeFunction() {
File defgFile = new File("/home/thor/Documents/ScratchPad/def.bin");
try(FileOutputStream fos = new FileOutputStream(defgFile)){
BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(fos,StandardCharsets.US_ASCII));
bos.write(Integer.toString(123));
bos.newLine();
bos.write(Integer.toString(96));
bos.newLine();
bos.write(Integer.toString(1));
bos.newLine();
bos.write("Water");
bos.newLine();
bos.write(Integer.toString(2));
bos.newLine();
bos.write("Forest");
bos.newLine();
bos.flush();
bos.close();
}
catch(IOException ex) {
Logger.getLogger(WriteClass.class.getName()).log(Level.SEVERE,"Can't open a new file",ex);
}
}
}
需要注意的重要一点是,我曾经OutputStreamWriter以 ASCII 格式编写文本文件。另一点是我们不必担心ByteOrder将 ASCII 值写入文件的位置。似乎Java正在处理它。
独立于平台的bos.newLine()方式来编写一个新行。 bos.flush()是强制性的,否则数据将不会被写入。
C代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
FILE *fp = fopen("def.bin","r");
int one,two,three;
fscanf(fp,"%d",&one);
fscanf(fp,"%d",&two);
printf("%d\n%d\n",one,two);
int index;
fscanf(fp,"%d",&index);
char* string;
fscanf(fp,"%s",string);
printf("%d\n%s\n",classno,string);
return 0;
}
我注意到字符串char*没有分配内存并且仍然有效。
添加回答
举报