更改文件上的字符(C编程)
嗯……我是C语言编程新手,我正在做一个练习。我需要在一个.txt文件上创建和写入,并将字母(或字符,如果您愿意)更改为字母表中的下一个3。因此,如果我有“Dog”,它需要更改为“Fri”,例如,我当然需要输出它 这就是我现在所拥有的,代码是不完整的,因为我不知道如何更改任何其他字母,因为即使这样也不能正常工作 它创建一个文件,在其中写入一点,关闭它以确保它被正确保存,再次操作它以读取文件,然后继续更改其中的字母更改文件上的字符(C编程),c,C,嗯……我是C语言编程新手,我正在做一个练习。我需要在一个.txt文件上创建和写入,并将字母(或字符,如果您愿意)更改为字母表中的下一个3。因此,如果我有“Dog”,它需要更改为“Fri”,例如,我当然需要输出它 这就是我现在所拥有的,代码是不完整的,因为我不知道如何更改任何其他字母,因为即使这样也不能正常工作 它创建一个文件,在其中写入一点,关闭它以确保它被正确保存,再次操作它以读取文件,然后继续更改其中的字母 #include<stdio.h> int main(void)
#include<stdio.h>
int main(void)
{
char c;
FILE *fp;
fp=fopen("file1.txt","w");
fprintf(fp,"Hello World");
fprintf(fp,"HELLO WORLD");
fclose(fp);
fp=fopen("file1.txt","r");
while(c!=EOF){
c=getc(fp);
if(c=="x"){
c="a";
}else if(c=="y"){
c="b";
}else if(c=="z"){
c="c";
}else if(c=="X"){
c="A";
}else if(c=="Y"){
c="B";
}else(c=="Z"){
c="C";
}
putchar(c);
}
fp=fopen("file1.txt","r");
fclose(fp);
return 0;
}
#包括
内部主(空)
{
字符c;
文件*fp;
fp=fopen(“file1.txt”,“w”);
fprintf(fp,“你好世界”);
fprintf(fp,“你好世界”);
fclose(fp);
fp=fopen(“file1.txt”,“r”);
而(c!=EOF){
c=getc(fp);
如果(c==“x”){
c=“a”;
}否则,如果(c==“y”){
c=“b”;
}否则,如果(c==“z”){
c=“c”;
}否则,如果(c==“X”){
c=“A”;
}否则,如果(c==“Y”){
c=“B”;
}其他(c==“Z”){
c=“c”;
}
普查尔(c);
}
fp=fopen(“file1.txt”,“r”);
fclose(fp);
返回0;
}
更新/编辑:
好的,我已经设法做到了,我没有完全理解我应该在代码中改变什么,或者在代码中把你的答案放在哪里,所以我在这里尝试了一个信念的飞跃,从你的建议中我了解到,字符c可以作为一个8位整数处理,所以我只是在检查了所有其他if语句后尝试了c+=3。代码现在起作用了
#include<stdio.h>
int main(void)
{
char c;
FILE *fp;
fp=fopen("file1.txt","w");
fprintf(fp,"Hello World");
fprintf(fp,"HELLO WORLD");
fclose(fp);
fp=fopen("file1.txt","r");
while((c=getc(fp))!=EOF){
if (!isalnum(c))
continue;
if(c=='x'){
c='a';
}else if(c=='y'){
c='b';
}else if(c=='z'){
c='c';
}else if(c=='X'){
c='A';
}else if(c=='Y'){
c='B';
}else if(c=='Z'){
c='C';
}else{
c+=3;
}
putchar(c);
}
fclose(fp);
return 0;
}
#包括
内部主(空)
{
字符c;
文件*fp;
fp=fopen(“file1.txt”,“w”);
fprintf(fp,“你好世界”);
fprintf(fp,“你好世界”);
fclose(fp);
fp=fopen(“file1.txt”,“r”);
而((c=getc(fp))!=EOF){
如果(!isalnum(c))
持续
如果(c=='x'){
c='a';
}else如果(c=='y'){
c='b';
}else如果(c=='z'){
c='c';
}else如果(c=='X'){
c='A';
}else如果(c=='Y'){
c='B';
}else如果(c=='Z'){
c='c';
}否则{
c+=3;
}
普查尔(c);
}
fclose(fp);
返回0;
}
谢谢各位的建议。它们帮了我很大的忙,我知道if语句本可以更好一点,但我对这类东西还是新手。我认为实现这一点的最简单方法是在字符值中添加3。棘手的部分是当您的偏移量从字母表上脱落时(例如,您将ascii
z
偏移3,您将得到}
)
您可以尝试以下方法:
if ( (c >= 'a') && (c <= 'z') )
{
c += 3;
if (c > 'z') // If the character falls off the alphabet, Start over at 'a'
c = c - 'z' + 'a';
}
if ( (c >= 'A') && (c <= 'Z') )
{
c += 3;
if (c > 'Z') // If the character falls off the alphabet, Start over at 'a'
c = c - 'Z' + 'A';
}
int c;
while((c = fgetc(fp_in)) != EOF)
{
if(islower(c))
{
const int loc = c - 'a'; /* Non-portable! */
loc = (loc + 3) % 26;
c = 'a' + loc;
}
else if(isupper(c))
{
const int loc = c - 'A'; /* Non-portable! */
loc = (loc + 3) % 26;
c = 'A' + loc;
}
putc(c, fp_out);
}
if((c>='a')&&&(c'z')//如果字符从字母表上脱落,请从'a'处重新开始
c=c-‘z’+‘a’;
}
if((c>='A')&&&(c'Z')//如果字符从字母表上脱落,请从'A'处重新开始
c=c-‘Z’+‘A’;
}
这里
c
是您正在修改的字符。如果您想将a映射到d、b映射到e、.x映射到a、y映射到b、z映射到c,您可以尝试以下操作:
if ((c >= 'a') && (c <= 'z')) {
c += 3;
}
if (c > 'z') {
c = 'a' + (c - 'z' - 1);
}
另外,正如其他人所指出的,字符文字用单引号括起来
编辑:
您应该在while循环中包含此代码,该循环从文件中逐字符读取,如下所示:
while ((c = fgetc(fpRead)) != EOF) { //file pointer to read
if ((c >= 'a') && (c <= 'z')) {
c += 3;
}
if (c > 'z') {
c = 'a' + (c - 'z' - 1);
}
putc(c,fpWrite); //different file to write to
}
while((c=fgetc(fpRead))!=EOF){//要读取的文件指针
如果((c>='a')&&(c'z')){
c='a'+(c-'z'-1);
}
putc(c,fpWrite);//要写入的不同文件
}
正如@unwind所指出的,在读取和写入同一个文件时,您必须小心。我认为这不是您的意图。如果您想重写同一个文件,请将其读入数组。然后以“w”模式打开该文件,将数组写入该文件。前面的内容将被重写。请注意,您无法进行比较
EOF
与类型为char
的值相比,它不适合。您需要int
大概是这样的:
if ( (c >= 'a') && (c <= 'z') )
{
c += 3;
if (c > 'z') // If the character falls off the alphabet, Start over at 'a'
c = c - 'z' + 'a';
}
if ( (c >= 'A') && (c <= 'Z') )
{
c += 3;
if (c > 'Z') // If the character falls off the alphabet, Start over at 'a'
c = c - 'Z' + 'A';
}
int c;
while((c = fgetc(fp_in)) != EOF)
{
if(islower(c))
{
const int loc = c - 'a'; /* Non-portable! */
loc = (loc + 3) % 26;
c = 'a' + loc;
}
else if(isupper(c))
{
const int loc = c - 'A'; /* Non-portable! */
loc = (loc + 3) % 26;
c = 'A' + loc;
}
putc(c, fp_out);
}
注:以上是不可移植的,因为它假设字符A-Z和A-Z在相邻位置进行编码。这是而不是由C保证的,因此代码将在使用此类字符集的系统上中断。对于使用某种ASCII(或UTF-8)派生码的典型现代系统,它将起作用
显然,在上/下分支中也存在大量重复,可以进行重构
请注意,上面使用了两个
文件*
指针,因为您不能读写同一个文件并就地覆盖。为什么所有if
s?您可以执行类似的操作,如果(c>='a'&&cc
是char变量,而“Z”
是char*(一种字符串)文字。您应该使用'z'
等。“x”
的类型是char*
,而不是char
。将其更改为'x'
开始。对所有其他字母都执行相同的操作。这里有一个小提示,不需要执行if/switch语句,例如:char c='a';printf(“c:%c\n”,c+3)
F在字母表中与D的距离不是三个字母,I和J也一样。你的意思是“Grj”吗?好吧,让我测试一下这个,我不知道我可以像数字一样使用字符c。(我的意思是<和>)。一个字符实际上是一个有符号的8位整数。因此,在任何可以使用数字的操作中都可以使用字符。嗯..这不起作用,我认为最好检查字符c是否不是结尾字母(x、y或z)之一首先,如果没有,那么我就使用普通方法。@TamásSzabó它的实现定义了char
是有符号的还是无符号的,它的大小是char\u BIT
bits。@unwind:谢谢澄清。到目前为止,我使用的每个平台上都有8位签名。但老实说,我从未检查过规范。