【发布时间】:2017-11-04 13:14:03
【问题描述】:
我接受了评论并重写了代码。但它仍然不起作用。 我打开一个包含多个句子的文本文件,将小写字母更改为大写字母,然后尝试在另一个文件中输入它们。 我不太清楚 read() 的第三个参数该使用什么。 如何更正代码?
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int fp,ftp,i,nread;
char str[300];
if(fp=open("text_in",O_RDONLY) < 0)
{
perror("open: ");
exit(1);
}
if(ftp=open("text_w", O_WRONLY |O_CREAT , 0644) < 0)
{
perror("open: ");
exit(1);
}
nread=read(fp,str,300);
for(i=0; i<=nread; i++)
{
if((str[i] >= 'a') && (str[i] <= 'z'))
{
str[i] -= ('a'-'A');
}
}
write(ftp,str,nread);
close(fp);
}
【问题讨论】:
-
你为什么要写
sizeof(txt),知道你可能少写read()? -
阅读手册。
open以负值失败。0是一个有效的文件描述符。read可能会以小于sizeof(txt)的值成功返回,并且它肯定不会在读取字符串后放置'\0-- 使用返回的数字(如果是正数)作为读取字符串的长度。 -
@EOF 说什么,加上 'strlen(txt)' 为什么? read() 返回一个值 - 你应该使用它。所有那些 sizeof、strlen 之类的都是错误的;不必要的、不安全的、不需要的。
-
您认为可以同时读写同一个文件的信念比大多数人都更聪明。
-
关于:
int fp;调用open()的返回值是文件描述符索引,而不是文件指针,建议:fd_inint ftp;存在类似的考虑@ 变量名称应表明content或usage(或更好,两者兼有),发布代码中使用的变量名称具有误导性