【发布时间】:2017-06-28 20:58:29
【问题描述】:
我尝试读取一个文件并将每个以小写开头的单词更改为以大写开头的同一个单词。
这是我得到的:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int zeichen;
fp = fopen("test.txt", "r+");
if(fp == NULL){
printf("Die Datei konnte nicht geoeffnet werden.\n");
}
else{
fseek(fp, 0L, SEEK_SET);
zeichen = fgetc(fp);
while(zeichen != EOF){
if(zeichen == ' '){
fseek(fp, 1L, SEEK_CUR);
if(('a' <= zeichen) && (zeichen <= 'z')){
zeichen = fgetc(fp);
fputc(toupper(zeichen), fp);
}
}
zeichen = fgetc(fp);
}
zeichen = fgetc(fp);
fclose(fp);
}
return 0;
}
我的 test.txt 文件根本没有改变。
任何建议我做错了什么?
编辑:
感谢您以不同的方式完成我的任务。
他们中的大多数都使用了我还没有学过的东西,所以我通过将字符从一个文件复制到另一个文件来尝试它 + 通过 toupper() 使每个单词的第一个字母大写,因为它确实很容易使用。然后删除旧文件+重命名新文件。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
FILE *fp, *neu;
int zeichen;
fp = fopen("test.txt", "r");
neu = fopen("new.txt", "w");
if(fp == NULL) {
printf("Die Datei konnte nicht geoeffnet werden.\n");
exit(EXIT_FAILURE);
}
while((zeichen = fgetc(fp)) != EOF) {
if(zeichen == ' ') {
fputc(zeichen, neu);
zeichen = fgetc(fp);
zeichen = toupper(zeichen);
fputc(zeichen, neu);
}
else{
fputc(zeichen, neu);
}
}
fclose(fp);
fclose(neu);
remove("test.txt");
rename("new.txt", "test.txt");
printf("File has been changed.\n");
return 0;
}
【问题讨论】:
-
if(zeichen == ' ')toupper()吗? -
我的目的是检查字符是否为空格,如果是,则向前移动一个字符并将其打印在与大写字母相同的位置。
-
显然你需要
else { fputc(zeichen, fp);}` 子句。 -
看
if(zeichen == ' '){ fseek(fp, 1L, SEEK_CUR); if(('a' <= zeichen) && (zeichen <= 'z')){,zeichen在第一个if()之后没有变化 -
一般来说,这对文本文件(读取和写入)来说是一件奇怪的事情,通常会读取文件并写入一个新文件,并在您进行更改时进行更改(您似乎试图用你的 else 子句做)。然后将新文件重命名为旧文件。另请注意,正如 dhke 指出的那样,您的代码是错误的,如果它们是 ' ',您只会查看字符
标签: c string file uppercase fseek