我有一个读取文件A的程序,然后将内容复制到文件B. 我想写第三个字符的文件B.我创建了一个循环,将每三个项重写为一个新的char数组。在文件B中我得到了奇怪的字符。我做错了什么?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main ()
{
int i;
char full_string[100];
char reduce_string[100];
char file_name_for_read[128];
char file_name_for_save[128];
printf("Enter file name for read...\n");
scanf ("%s", file_name_for_read);
strcat(file_name_for_read,".txt");
FILE *fileA;
fileA=fopen(file_name_for_read,"r");
printf("Enter file name for save...\n");
scanf ("%s", file_name_for_save);
strcat(file_name_for_save,".txt");
FILE *fileB;
fileB=fopen(file_name_for_save,"w");
while(fgets(full_string, sizeof(full_string), fileA) !=NULL)
{
for(i = 2; i < 100; i+=3)
{
reduce_string[i-=2] = full_string[i+=1];
}
fprintf(fileB, "%s", reduce_string);
}
fclose(fileA);
fclose(fileB);
}
答案 0 :(得分:8)
我做错了什么?
有几件事。至少,
在内部循环中,迭代full_string
的整个长度,无论最近fgets()
从文件中实际读取了多少这些字节。
在内部循环中,您调用未定义的行为,因为表达式reduce_string[i-=2] = full_string[i+=1]
对i
的值有两个副作用,这两个副作用相对于彼此未经过排序。
在该表达式中,i - 2
无论如何都不是您想要的索引,除非i
为2,因为您在每次迭代时将i
增加3。你最终会填补一些职位并跳过其他职位。
您不会在复制到reduce_string
的数据末尾添加空终结符。
您的策略无论如何都不会导致复制文件的每个第三个字符;相反,它复制每行的每个第三个字符 。除非输入文件的所有行长度都是3的倍数,否则它们会有所不同。
答案 1 :(得分:2)
读取文件A,然后将内容复制到文件B.我想每隔三个字符写入文件B.
如果行不重要,
阅读3个字符似乎很简单,写第3个字符。
for(;;) {
fgetc(fileA);
fgetc(fileA);
int ch = fgetc(fileA);
if (ch == EOF) break;
fputc(ch, fileB);
}
或
int ch;
do {
fgetc(fileA);
fgetc(fileA);
ch = fgetc(fileA);
} while (ch != EOF && fputc(ch, fileB) != EOF);
答案 2 :(得分:0)
最简单的方法是为每个数组使用不同的索引,这样每个数组都可以按照自己的速度运行。
int i,x;
for(i = 0, x=0; i < 1000; i+=3, x++)
{
reduce_string[x] = full_string[i];
}
fprintf(fileB, "%s", reduce_string);
答案 3 :(得分:-1)
我不会亲自使用fgets
来读取整个文件并将每个第三个字节写入新文件。最好确定文件的长度,然后使用malloc
分配一个大小的缓冲区,并将整个内容fread
放入缓冲区:
fseek(ifp, 0, SEEK_END);
length = ftell(ifp);
rewind(ifp);
buffer = malloc(length + 1);
对于复制操作,这似乎是使用指针算法的一个很好的选择。
假设我们现有的char
数组(我们要复制的数组)称为array1
,长度为length
,目标数组为array2
。< / p>
size_t written = 0;
array2 = malloc(length);
char *p = array1;
while(p <= (array1 + length))
{
array2[written] = *p;
written++, p+=3;
}
此代码运行完毕后,array2
将包含array1
的每个第三个元素,且长度为written
。
答案 4 :(得分:-2)
检查此代码。在您的代码中,您有reduce_string[i-=2] = full_string[i+=1];
- 我不知道您在哪里提出它,但这不起作用。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main ()
{
int i;
char full_string[100];
char reduce_string[100];
char file_name_for_read[128];
char file_name_for_save[128];
printf("Enter file name for read...\n");
scanf ("%s", file_name_for_read);
strcat(file_name_for_read,".txt");
FILE *fileA;
fileA=fopen(file_name_for_read,"r");
printf("Enter file name for save...\n");
scanf ("%s", file_name_for_save);
strcat(file_name_for_save,".txt");
FILE *fileB;
fileB=fopen(file_name_for_save,"w");
while(fgets(full_string, 50, fileA) !=NULL)
{
int cnt = 0;
for(i = 2; i < strlen(full_string)-3; i+=3)
{
reduce_string[cnt++] = full_string[i];
}
fprintf(fileB, "%s", reduce_string);
}
fclose(fileA);
fclose(fileB);
}