写系统调用C,用垃圾填充文件

问题描述 投票:1回答:2

当尝试从文件中过滤特定单词并将它们写入新文件时,我遇到了一些问题。我想做的是只写在'&'之后直到第一个数字的单词。

例如(这是我正在读取的文件的内容:

& some 12 test1 test2
$ thisword 4 no no no no

对于以上输入,我只想将单词[[some和thisword写入一个新文件。

我的代码正在工作,但是,它不仅打印那些单词,而且还在打印垃圾。

int main (argc,argv) int argc; char *argv[]; { int inpfd,outpfd,n; int i=0; char tmp[2],buff[BUFFSIZE]; //This is our buffer //Open the output file of ispell inpfd = open("outputfile.txt",O_RDONLY); //Check if open command failed if(inpfd == -1) { printf("Failed to open file"); exit(1); } //Here we are reading from output file read(inpfd,buff,999); buff[999] = '\0'; close(inpfd); outpfd = open("w.txt",O_WRONLY); if(outpfd == -1) { printf("Cannot open file for writing!"); exit(1); } //Looping over the Buffer for (i=0; i <BUFFSIZE; i++) { printf("This is the char : %c \n",buff[i]); if(buff[i] == '&') { i++; while( !(isdigit(buff[i])) ) { //Write into output file //As long as we didnt reach tmp[0] = buff[i]; // To the digit write(outpfd,tmp,1); i++; } write(outpfd,"\n",1); //Moving to the next line } } close(outpfd); return 0; }

这是写完后文件的输出(我只粘贴一小部分垃圾):

some thisword ^@^@^@<FD>^?^@^@<80><B2>-<AD><FD>^?^@^@<B0> <B0>be^@^@^@^@೵[^X^?^@^@^@<B4>-<AD><FD>^?^@^@s^X<F0>[^X^?^@^@^@<FF>^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@/

我不知道这是什么垃圾,有人可以帮忙吗?
c linux system-calls
2个回答
5
投票
您的问题在此代码中

read(inpfd,buff,999); buff[999] = '\0'; close(inpfd);

您忽略所阅读内容的实际长度的地方

您至少应该使用实际读取的数据长度-这样

int len = read(inpfd,buff,999); buff[len] = '\0'; close(inpfd);

但是请注意,以上内容有其自身的问题,因为read并不总是一次性返回所有内容,并且可以因中断等而提前终止,但这超出了此问题的范围。对于非常简单的应用程序,您可能只需要进行简单的修改即可。

现在,在空终止之后,从读取结果中知道了文件的实际长度,您还需要修复循环-第一步是让您的外循环仅查看您读取的数据,所以

所以改为

for (i=0; i <BUFFSIZE; i++) {

使用实际长度;

for (i=0; i <len; i++) {

循环中的代码也包含几个问题,其中一个循环终止,您也必须解决。

2
投票
您正在遍历缓冲区的整个大小,即999个项目。

for (i=0; i <BUFFSIZE; i++) {

输入文件几乎肯定少于999个项目。因此,一旦您处理完所提供的输入,就只在处理垃圾直到计数器达到999!
© www.soinside.com 2019 - 2024. All rights reserved.