我希望将poem.txt中的所有其他单词大写,从每行开始。我创建了一个函数capitalize(),它接收一个字符串(例如:"一个孤独的数字,如root 3"),将每个其他单词大写并返回它(例如:返回"像Root 3这样的孤独数字#34;)。我试图从poem.txt读取每一行,将该行发送到capitalize()然后接收更新的字符串并用更新的字符串替换该行,但我无法弄清楚如何。我测试了我的程序,它可以读取文件的内容并将它们发送到capitalize()并逐行显示,但它不能写入和替换每一行。我尝试使用fprintf(),但它没有工作。你们能开导我吗?
poem.txt(执行前)
我担心我永远都会
一个孤独的数字,如根三
这三个是好的和正确的,
为什么我的三个人必须远离视线
在恶性的平方根标志下面,
我希望我是九岁
对于九个可以阻止这个邪恶的把戏,
只需一些快速算术
我知道我永远不会看到太阳,如1.7321
这是我的现实,一种悲伤的非理性
什么时候开玩笑!我看到了什么,
三个的另一个平方根
悄悄地来到华尔兹,
现在我们一起繁殖
形成一个我们喜欢的数字,
欣喜为整数
我们摆脱了我们的死亡债券
随着魔杖的浪潮
我们的方根标志变得脱胶
你对我的爱已经更新了
代码:
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int reverse(int otherWord)
{
if (otherWord)
return 0;
else
return 1;
}
void capitalise(char *s)
{
int start = 1;
int otherWord = 1;
for (; *s; s++)
{
if (start && otherWord)
*s = toupper(*s);
start = isspace(*s);
if (start)
otherWord = reverse(otherWord);
}
}
int main(int argc, char *argv[])
{
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
fp = fopen("poem.txt", "r+");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1) {
capitalise(line);
fprintf(fp, "%s", line); // Here's the problem, this line!
}
fclose(fp);
if (line)
free(line);
exit(EXIT_SUCCESS);
}
poem.txt(执行后):
我担心我永远都会
我担心我永远都会
EE
EE
三是一切都是好的和正确的,
三是这一切都很好而且对,
诅咒邪恶的平方根标志,
Eath the Vicious square Root sign,
ne可以阻止这个邪恶的伎俩,
Ne可以阻止这个邪恶的伎俩,
知道我永远不会看到太阳,如1.7321
知道我永远不会看到太阳,如1.7321
en hark!我看到了什么,
恩哈尔!这是什么我看到的,
Ë
Ë
悄悄地来到华尔兹,
S静静地来华尔兹舞,
形成一个我们喜欢的数字,
形成我们喜欢的号码,
我们脱离了我们的死亡债券
E从我们的凡人债券中解脱出来
uare根标志变得脱胶
Uare根标志变得脱胶
EDED
poem.txt(预期执行):
我担心我永远都会
一个孤独的数字像根三
...
答案 0 :(得分:2)
发生行重复是因为您在写入原始文件的同时还要阅读它。
事实证明,从文件中删除和编辑行可能非常困难。如果要编辑文件中的行,可以使用一种简单的方法来写入新的临时文件,将其重命名为原始文件,然后删除临时文件。
答案 1 :(得分:2)
可以就地执行此操作,但这很危险,如果某些内容失败,您可能会丢失数据。
稍微简化的版本将是
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int reverse(int otherWord)
{
if (otherWord) {
return 0;
} else {
return 1;
}
}
void capitalise(char *s)
{
int start = 1;
int otherWord = 1;
for (; *s; s++) {
if (start && otherWord) {
*s = toupper(*s);
}
start = isspace(*s);
if (start) {
otherWord = reverse(otherWord);
}
}
}
int main(void)
{
FILE *fp;
char *line = NULL;
size_t len = 0;
ssize_t read;
long offset = 0L;
int res;
// you might prefer "w+" instead
fp = fopen("poem.txt", "r+");
if (fp == NULL) {
fprintf(stderr, "Opening file poem.txt failed\n");
exit(EXIT_FAILURE);
}
while ((read = getline(&line, &len, fp)) != -1) {
capitalise(line);
// set position relative to start of file
if ((res = fseek(fp, offset, SEEK_SET)) < 0) {
fprintf(stderr, "fseek failed\n");
exit(EXIT_FAILURE);
}
// printing line sets file pointer to end of line
fprintf(fp, "%s", line);
// get that position
offset = ftell(fp);
}
// fclose() might fail, too, see man-page for details
fclose(fp);
if (line) {
free(line);
}
exit(EXIT_SUCCESS);
}
答案 2 :(得分:0)
如果我没记错的话,你应该能够重写文件的内容,因为它已经存在了标志&#34; w&#34;。替换你的&#34; r +&#34;用&#34; w&#34;