我是C编程的新手,只是编写一个简单的程序来读取文本文件中的所有行,并用新的代码替换每个数字。这是我的代码。它会为每一行打印到控制台,但不会打印到文件。有人可以建议我的代码有什么问题吗?
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE * file_ptr;
int num;
char line[128];
file_ptr = fopen (argv[1], "a+");
if(file_ptr==NULL)
{
printf("Error opening file");
}
if(file_ptr!=NULL)
{
while(fgets(line,128,file_ptr)!=NULL)
{
fputs("df",file_ptr);
printf("2");
}
}
fclose(file_ptr);
return(0);
}
答案 0 :(得分:9)
问题是你正在从同一个文件中读写,你的读写交互。
使用模式a+
打开文件(追加,允许读取)将文件位置设置在文件的开头,因此第一次调用fgets
会读取第一行。但是在附加模式下,所有写入都在文件末尾执行。因此,第一次调用fputs
会将文件位置设置为文件末尾,然后写入df
。由于读取和写入都有单个文件位置,因此下一次调用fgets
将在文件末尾执行,并且不会读取任何内容。
文件位置的行为使得模式a+
主要适用于您想要读取文件的当前内容然后在末尾添加内容。
请注意,修改文件中间内容的唯一方法是将字节序列替换为具有相同长度的字节序列。因此,您可以将12
替换为df
,但不能将123
替换为df
:如果您设置123
所在的文件位置并写入df
,您最终会得到df3
。要用可能不同长度的字符串替换数字,您需要将文件重写为整体
如果要完全修改文件,有三种主要技巧:
第一种方法有一个主要缺点:如果程序崩溃或计算机断电,文件将丢失。因此,您几乎应该总是使用另外两种方法中的一种:它们使用更多的磁盘空间,但增加的安全性几乎总是值得的。
答案 1 :(得分:0)
The following code, which incorporated several oversights in the OP code
will tell the user about any error conditions that occur
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE * file_ptr;
char line[128];
if( 2 > argc )
{ // then invalid number of parameters
printf( "\nUsage: %s filename\n", argv[0]);
exit(EXIT_FAILURE );
} // end if
// implied else, file name parameter exists
if( NULL == (file_ptr = fopen (argv[1], "a+") ) ) // open for read and append
{ // then fopen failed
perror( "fopen failed" ); // output reason for failure to open file
exit(EXIT_FAILURE );
} // end if
// implied else, fopen successful
// note: second pass through this loop will fail as file pointer will be at end of file
// always put literal first, so compiler will catch syntax errors
while(NULL != fgets(line,sizeof(line),file_ptr) )
{
if( EOF == fputs("df",file_ptr) )// appends 'df' to end of file
{ // then fputs failed
perror( "fputs failed" );
exit( EXIT_FAILURE );
}
// implied else, fputs successful
printf("2");
fflush( stdout );
} // end while
fclose(file_ptr);
return(0);
} // end function: main