我一直在尝试同时从文件中读取和写入,并且我试图将text.txt内容中的所有选项卡替换为空格。这是我的代码:
int main()
{
FILE* filePtr = fopen("text.txt", "w+");
char c;
c = fgetc(filePtr);
fpos_t num;
while(c != EOF)
{
if(c == '\t')
{
fgetpos(filePtr, &num);
num--;
fsetpos(filePtr, &num);
fputc(' ', filePtr);
}
c = fgetc(filePtr);
}
}
text.txt的内容如下:
你好我的名字\ t是\ t杰克!
当我运行此代码时,text.txt文件中的输出只是空格。那里没有人物。我该怎么做才能让替换按预期进行?
答案 0 :(得分:7)
您的代码存在三个主要问题:
以模式"w+"
打开文件截断文件(删除所有内容)。您可以读取和写入它,但原始内容将丢失。模式"r+"
将打开它进行读写,而不更改内容,文件位置最初位于文件的开头。
对类型fpos_t
的值执行算术是不安全的。无论如何它是不必要的;有一种更简单的方法可以将文件位置移动相对数量。
完成后,您不会关闭文件。
您的代码的这种变体适合我:
#include <stdio.h>
int main(void)
{
FILE* filePtr = fopen("text.txt", "r+");
char c;
while((c = fgetc(filePtr)) != EOF)
{
if(c == '\t')
{
fseek(filePtr, -1, SEEK_CUR);
fputc(' ', filePtr);
}
}
fclose(filePtr);
return 0;
}
答案 1 :(得分:2)
&#34; W +&#34;写/更新:创建一个空文件并打开它进行更新(两者都有 用于输入和输出)。如果已存在具有相同名称的文件 内容被丢弃,文件被视为新的空文件。
&#34; R +&#34;读/更新:打开文件进行更新(包括输入和输出)。 该文件必须存在。
答案 2 :(得分:1)
这里的代码有两个主要问题:
&#34; w +&#34;模式删除文件的所有内容,如果它从之前退出然后写入文件,而&#34; r +&#34;模式使您可以使用之前的当前数据。
来自Pelles C帮助文件:
当使用更新模式打开文件时(&#39; +&#39;作为mode参数中的第二个或第三个字符),可以在关联的流上执行输入和输出。但是,如果没有对fflush功能或文件定位功能(fseek,fsetpos或rewind)的干预调用,输出不应直接输入,并且输入不应直接跟随输出而不干预文件定位函数,除非输入操作遇到文件结尾。
这是对我有用的代码:
int main(void)
{
FILE* filePtr = fopen("text.txt", "r+");
char c;
while( (c = fgetc(filePtr)) != EOF )
{
if(c == '\t')
{
fseek(filePtr, -1, SEEK_CUR);
fputc(' ', filePtr);
fseek(filePtr, 0, SEEK_CUR);
}
}
fclose(filePtr)
return 0;
}
答案 3 :(得分:0)
问题是您正在使用w+
fopen标志并尝试递减一个复杂类型的fpos_t
变量。您应该使用r+
,然后递减num.__pos
以使其正常工作